Ви не увійшли.
Вообще идея не моя. Volvo digital key - https://www.youtube.com/watch?v=FF6JtS3y1xA Они используют приложение для смартфона. Возможно не всё так гладко как в ролике, но в любом случае машина каким-то образом сканирует эфир и видит телефон. Значит bluetooth каким-то образом можно выводить из спячки. Иначе постоянно включенный bluetooth действительно посадит смартфон. Вопрос как они "будят" телефон? Судя по ролику, чувак не спаривал машину с телефоном (возможно сама машина имеет доступ в сеть и ей залили удалённо пару.) Даже если устройства спарены, как тогда будить телефон для проверки MAC/другой инфы? Как по мне, это всё тянет на полноценный комп с линуксом + куча софта.
Хочется вам лишний раз разряжать аккумулятор телефона?
В теории акуумулятор не должен сильно разряжаться, так как радиоинтерфейсы работают не постоянно. По крайней мере WiFi отключается через минуту после блокировки экрана и далее периодически телефон просыпается и включает WiFi, лезет в сеть. Думаю так же обстоят дела и с bluetooth. Надо только заставить bluetooth в телефоне реагировать на "внешние раздражители".
Хотя, может, я себе что-то придумал нереальное.
Нужен совет. Есть идея организовать контроль доступа в помещение через смартфон/телефон с bluetooth. Берём Arduino, bluetooth модуль, кнопка. Ардуино постоянно мониторит эфир на наличие активных bluetooth устройств. Если в радиусе действия появляется разрешённое устройство, то нажатием кнопки можно отрыть замок. Но даже у меня, чайника, появляется несколько вопросов:
1. Может ли ардуино выполнять поиск bluetooth устройств? Всё что мне попадалось в интернете - bluetooth работает как удалённый com порт.
Если да - какие библиотеки?
2. Если нет. Какое устройство могло бы справиться с поставленной задачей? Rapsberry/Orange, может что-то другое esp8266/wifi?
3. По умолчанию все bluetooth устройства скрыты, надо включать видимость и всех их надо "спаривать". Как это обойти не устанавливая клиент/софт на смартфоне? Буду ещё читать спецификацию по bluetooth.
Буду рад любому совету.
Опыт у меня конечно очень маленький. Но, я разбирал MakerBot Replicator 2, там обыкновенная Arduino Mega и под каждый двигатель отдельный драйвер. Чем они руководствовались при проектировании данного принтера - не знаю. Хотя возможно в природе и существуют драйвера способные управлять несколькими двигателями. Может гуру что подскажут.
Спасибо за ответы! нашла решение.
Поделитесь решением. Мне тоже интересно как записывать данные в файл.
он никогда не крутится плавно - всегда шагами.
просто на больших оборотах это менее заметно.
кроме того на нормальных драйверах есть режим микрошага, который даёт ещё более визуальную плавность
По поводу микрошагов я уже пробовал. Действительно шаги намного менее заметные, движение плавнее. Но мне не хватает скорости вращения. Большое спасибо за ответы.
Буду комбинировать режимы.
gorenkov пише:Когда двигатель крутится на малых оборотах, он немного вибрирует и работает микрорывками - вращение не плавное.
Всё правильно, это же шаговый двигатель, он шагает)
Получается заставить их "плавно" крутиться не получится? А как же тогда он плавно крутится на больших оборотах?
Ещё заметит одну неприятную для меня особенность. Когда двигатель крутится на малых оборотах, он немного вибрирует и работает микрорывками - вращение не плавное. И соответственно тихонько "бурчит". Когда он крутится быстро - работает тихо и плавно. Это нормально?
у шагового двигателя есть зона разгона
сначала нужно довести скорость до этой зоны, а уже потом разгонять до высоких скоростей
есть теория, схемы, графики
Спасибо за направление. Будем искать...(с)
Конденсаторы для убирания помех поставлены, провода не перепутаны, программа не подвисает, в ней переполнения целых типов не происходят? :-)
Конденсаторов - нет
Провода 100% не перепутаны
программа не подвисает, всё работает стабильно и прогнозируемо
насчёт переполнений не уверен - слишком мал опыт в программировании и работе с ардуино.
Вот мой скетч, через консоль вижу постепенное увеличение константы отвечающей за скорость. После доситжения значения 200 и больше, скорость не увеличивается. После 300 двигатель начинает быстро крутиться. Если вращаю ручку энкодера в обратную сторону, происходит обратный эффект. Сначала скорость падает, но не уменьшается, а при значении меньше 200, скорость начинает уменьшаться.
/*
Stepper Motor Control - one revolution
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
The motor should revolve one revolution in one direction, then
one revolution in the other direction.
Created 11 Mar. 2007
Modified 30 Nov. 2009
by Tom Igoe
*/
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
int beg = 0;
int dir = 1;
// for your motor
//int button = 6;
//int switcher = 6;
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 2, 3);
//these pins can not be changed 2/3 are special pins
// Setting up the counter
int reading = 0;
int lowest = -500;
int highest = 500;
int changeamnt = 40;
// Timing for polling the encoder
unsigned long currentTime;
unsigned long lastTime;
// Pin definitions
const int pinA = 4;
const int pinB = 5;
int button = 6;
// Storing the readings
boolean encA;
boolean encB;
boolean lastA = false;
void setup() {
// set the speed at 60 rpm:
//myStepper.setSpeed(200);
// initialize the serial port:
pinMode(button, INPUT);
// pinMode(switcher, INPUT);
// set the two pins as inputs with internal pullups
pinMode(pinA, INPUT_PULLUP);
pinMode(pinB, INPUT_PULLUP);
//pinMode(SW, INPUT_PULLUP);
digitalWrite(button , HIGH);
// Set up the timing of the polling
currentTime = millis();
lastTime = currentTime;
// Start the serial monitor for debugging
Serial.begin(9600);
}
void loop() {
// Read elapsed time
currentTime = millis();
// Check if it's time to read
if(currentTime >= (lastTime + 5))
{
// read the two pins
encA = digitalRead(pinA);
encB = digitalRead(pinB);
// check if A has gone from high to low
if ((!encA) && (lastA))
{
// check if B is high
if (encB)
{
// clockwise
if (reading + changeamnt <= highest)
{
reading = reading + changeamnt;
beg = reading;
}
}
else
{
// anti-clockwise
if (reading - changeamnt >= lowest)
{
reading = reading - changeamnt;
beg = reading;
}
}
// Output reading for debugging
Serial.print("Reading ");
Serial.println(reading);
Serial.print("Dir ");
Serial.println(dir);
// Serial.print("SW ");
// Serial.println(switcher);
/* Serial.print("lastA ");
Serial.println(lastA);
Serial.print("lastTime ");
Serial.println(lastTime);
*/
}
// store reading of A and millis for next loop
lastA = encA;
lastTime = currentTime;
}
if (beg == 0)
{
myStepper.setSpeed(0);
myStepper.step(0);
}
if (beg > 0)
{
// dir = 1;
myStepper.setSpeed(beg);
myStepper.step(dir);
}
if (beg < 0)
{
myStepper.setSpeed(-beg);
myStepper.step(-dir);
}
if ( digitalRead (button))
{}
else
{
beg = 0;
reading = 0;
Serial.println("Stop");
}
/* if ( digitalRead(switcher) )
{
beg = 0;
reading = 0;
}
*/
}
Здравствуйте,
http://arduino-ua.com/prod531-Shagovii_ … -1004A_27V - шаговый двигатель
http://arduino-ua.com/prod527-Draiver_s … ya_DRV8834 - драйвер
Подскажите, пожалуйста. Пытаюсь энкодером регулировать скорость шагового двигателя. В общем всё получается, но скорость регулирования не плавная. К примеру, я кручу ручку энкодера и скорость постепенно увеличивается, затем наступает момент когда скорость не увеличивается. А потом через несколько оборотов энкодера двигатель начинает крутиться как бешеный. Это нормально для шагового двигателя или что-то я сделал не так?
Заранее благодарен.
если бы вы вышли из подполья и указали каким драйвером пользуетесь - шанс получить поддержку значительно возрастает
Прошу прощения, что не написал об оборудовании.
Шаговик - http://arduino-ua.com/prod531-Shagovii_ … -1004A_27V
Драйвер - http://arduino-ua.com/index.php?productID=527
Энкодер - http://arduino-ua.com/prod803-enkoder
Со скоростью и направлением вращения двигателя я разобрался. Не разобрался ещё в нескольких вопросах.
1. Не могу заставить при нажатии кнопки на энкодере, останавливать двигатель (а ещё лучше отключать питание на драйвере)
2. Текущий код/аппаратная реализация не свсегда идеально понимают вращение ручки энкодера.
3. Могу пальцами остановить вращение вала двигателя (хоть и с усилием), читал что правильно настроив двигатель его ОЧЕНЬ трудно остановить.
Но я пока большой новичёк в этом деле, поэтому не отчаиваюсь - надо только время! В интернете есть вся информация + форумы.
обычно на драйвере есть выход enable
вот его бросайте на пин дуни и вкл -выкл
В документации к драйверу такого не было. Спасибо большое, буду экспериментировать. Бросать через отдельный резистор или можно использовать встроенный?
gorenkov пише:Правда не совсем понимаю как полностью отключать питание от двигателя когда он не крутится - а то он заметно греется. Может есть у кого-то идеи на этот счёт?
вы шаговик подключаете через драйвер.
вот на драйвере и отключайте питание во время простоя
Спасибо за ответ. прошу прощения, я не правильно выразился. Правильный вопрос - Как отключать питание программно ?
Проблема решена, переписал скетч и всё работает. Правда не совсем понимаю как полностью отключать питание от двигателя когда он не крутится - а то он заметно греется. Может есть у кого-то идеи на этот счёт?
/*
Stepper Motor Control - one revolution
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
The motor should revolve one revolution in one direction, then
one revolution in the other direction.
Created 11 Mar. 2007
Modified 30 Nov. 2009
by Tom Igoe
*/
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
int beg = 0;
int dir = 1;
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 2, 3);
//these pins can not be changed 2/3 are special pins
// Setting up the counter
int reading = 0;
int lowest = -200;
int highest = 200;
int changeamnt = 20;
// Timing for polling the encoder
unsigned long currentTime;
unsigned long lastTime;
// Pin definitions
const int pinA = 4;
const int pinB = 5;
// Storing the readings
boolean encA;
boolean encB;
boolean lastA = false;
void setup() {
// set the speed at 60 rpm:
//myStepper.setSpeed(200);
// initialize the serial port:
// set the two pins as inputs with internal pullups
pinMode(pinA, INPUT_PULLUP);
pinMode(pinB, INPUT_PULLUP);
// Set up the timing of the polling
currentTime = millis();
lastTime = currentTime;
// Start the serial monitor for debugging
Serial.begin(9600);
}
void loop() {
// Read elapsed time
currentTime = millis();
// Check if it's time to read
if(currentTime >= (lastTime + 5))
{
// read the two pins
encA = digitalRead(pinA);
encB = digitalRead(pinB);
// check if A has gone from high to low
if ((!encA) && (lastA))
{
// check if B is high
if (encB)
{
// clockwise
if (reading + changeamnt <= highest)
{
reading = reading + changeamnt;
beg = reading;
// myStepper.setSpeed(beg);
// myStepper.step(1000);
}
}
else
{
// anti-clockwise
if (reading - changeamnt >= lowest)
{
reading = reading - changeamnt;
beg = reading;
// myStepper.setSpeed(beg);
// myStepper.step(1000);
}
}
// Output reading for debugging
Serial.print("Reading ");
Serial.println(reading);
Serial.print("Dir ");
Serial.println(dir);
}
// store reading of A and millis for next loop
lastA = encA;
lastTime = currentTime;
}
if (beg == 0)
{
myStepper.setSpeed(0);
myStepper.step(0);
}
if (beg > 0)
{
// dir = 1;
myStepper.setSpeed(beg);
myStepper.step(dir);
}
if (beg < 0)
{
myStepper.setSpeed(-beg);
myStepper.step(-dir);
}
}
Здравствуйте,
Помогите советом с кодом. Хочу с помощью энкодера управлять скоростью вращения шагового двигателя. Получается только в одном направлении и то, пока dir больше нуля. Как только dir становится меньше нуля - двигатель останавливается. Что я делаю не так? Может кто-то уже сталкивался с таким? В интернете в основном примеры в которых двигатель повторяет движения энкодера.
Заранее благодарен.
/*
Stepper Motor Control - one revolution
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
The motor should revolve one revolution in one direction, then
one revolution in the other direction.
Created 11 Mar. 2007
Modified 30 Nov. 2009
by Tom Igoe
*/
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
int beg = 1;
int dir = 1;
// for your motor
Stepper myStepper(stepsPerRevolution, 2, 3);
//these pins can not be changed 2/3 are special pins
// Setting up the counter
int reading = 0;
int lowest = -200;
int highest = 200;
int changeamnt = 20;
// Timing for polling the encoder
unsigned long currentTime;
unsigned long lastTime;
// Pin definitions
const int pinA = 4;
const int pinB = 5;
// Storing the readings
boolean encA;
boolean encB;
boolean lastA = false;
void setup() {
// set the two pins as inputs with internal pullups
pinMode(pinA, INPUT_PULLUP);
pinMode(pinB, INPUT_PULLUP);
// Set up the timing of the polling
currentTime = millis();
lastTime = currentTime;
// Start the serial monitor for debugging
Serial.begin(9600);
}
void loop() {
// Read elapsed time
currentTime = millis();
// Check if it's time to read
if(currentTime >= (lastTime + 5))
{
// read the two pins
encA = digitalRead(pinA);
encB = digitalRead(pinB);
// check if A has gone from high to low
if ((!encA) && (lastA))
{
// check if B is high
if (encB)
{
// clockwise
if (reading + changeamnt <= highest)
{
reading = reading + changeamnt;
beg = reading;
// myStepper.setSpeed(200);
// myStepper.step(200);
}
}
else
{
// anti-clockwise
if (reading - changeamnt >= lowest)
{
reading = reading - changeamnt;
beg = reading;
}
}
// Output reading for debugging
Serial.println(reading);
}
// store reading of A and millis for next loop
lastA = encA;
lastTime = currentTime;
}
if (beg > 0)
{
dir = 1;
}
else if (beg < 0)
{
dir = -1;
}
else {}
myStepper.setSpeed(beg);
myStepper.step(dir);
}
Во время работы, драйвер и двигатель заметно греются. Двигатель довольно хорошо греется.
Вот мои результаты:
1. Ограничил силу тока на каждую обмотку, как описано в инструкции на сайте производителя.
2. Дал нормальное питание (10В, 5А) - двигатель заработал, пример скетча ниже:
/*
Stepper Motor Control - one revolution
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
The motor should revolve one revolution in one direction, then
one revolution in the other direction.
Created 11 Mar. 2007
Modified 30 Nov. 2009
by Tom Igoe
*/
#include <Stepper.h>
const int stepsPerRevolution = 6000; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 2, 3);
void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(10);
// initialize the serial port:
Serial.begin(9600);
}
void loop() {
// step one revolution in one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(1000);
// step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(1000);
}
У меня два вопроса:
- двигатель всё время попискивает, - и во время движения и когда остановлен (использую стандартные тоненькие проводки)
- двигатель можно остановить пальцами во время движения
Что я делаю не так?
почитайте http://bildr.org/2011/06/easydriver/
Спасибо за ссылку. К сожалению ясности она мне не дала, буду ещё раз перечитывать.
На сайте pololu в faq я нашёл скетч для теста и как подключить эти компоненты между собой. Сделал всё по инструкции, а моторчик дальше только пищит
1. Может кто подскажет, при каких ситуациях моторчик может пищать и не двигаться? Во время пищания/подачи питания вал блокируется и прокрутить его не возможно.
2. Для чего нужен SLEEP, зачем на него постоянно подавать 5в? Нашёл вот эту статью - http://arduino.ru/forum/programmirovani … igatelem-0 она меня ещё больше запутала...
/* Simple step test for Pololu stepper motor driver carriers
This code can be used with the A4988, DRV8825, DRV8824, and
DRV8834 Pololu stepper motor driver carriers. It sends a pulse
every 500 ms to the STEP pin of a stepper motor driver that is
connected to pin 2 and changes the direction of the stepper motor
every 50 steps by toggling pin 3. */
#define STEP_PIN 2
#define DIR_PIN 3
bool dirHigh;
void setup()
{
dirHigh = true;
digitalWrite(DIR_PIN, HIGH);
digitalWrite(STEP_PIN, LOW);
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
}
void loop()
{
// Toggle the DIR pin to change direction.
if(dirHigh)
{
dirHigh = false;
digitalWrite(DIR_PIN, LOW);
}
else
{
dirHigh = true;
digitalWrite(DIR_PIN, HIGH);
}
// Step the motor 50 times before changing direction again.
for(int i = 0; i < 50; i++)
{
// Trigger the motor to take one step.
digitalWrite(STEP_PIN, HIGH);
delay(250);
digitalWrite(STEP_PIN, LOW);
delay(250);
}
}
Здравствуйте,
Купил Arduino UNO, шаговый двигатель http://arduino-ua.com/prod531-Shagovii_ … -1004A_27V, и рекомендуемый драйвер к нему - http://arduino-ua.com/prod527-Draiver_s … ya_DRV8834. Схему подключения взял на сайте производителя:
Чётко понимаю как подключить драйвер и двигатель (на схеме всё чётко расписано), а вот как подключить драйвер и ардуино - не понимаю. К каким пинам подключать Step и Dir. Нашёл несколько статей в интернете, и они кардинально отличаются друг от друга.
Помогите, пожалуйста, советом как это правильно подключить и набросать скетч или дайте ссылку на теорию. Заранее благодарен за любую помощь.
По этой статье мне удалось только добиться пищания двигателя - http://arduino.ru/forum/programmirovani … igatelem-0