Форум myROBOT.ru » Шаг за шагом » Делаем роботов » Arduino + L293D + photoresistor

Страниц (2): [1] 2 »
 

1. rembytex - 16 Января, 2014 - 23:46:59 - перейти к сообщению
Имеем (хотя пока оно меня имеет Улыбка ): Есть всё вышеуказанное + мотор. Как сделать в программе чтобы при определённой освещенности - темно - двигатель повернулся на определенный градус в одну сторону - светло - в другую. Всё остальное время стоит. Меня интересует именно как по времени рассчитать угол поворота, т.е. программно по времени методом подбора некоторого числа (условно). Мотор с редуктором. Не лезет в мою голову мысль - хоть убей! Прошу помощи у уважаемых гуру роботостроения. Зарание спасибо.
2. Роботов - 16 Января, 2014 - 23:53:50 - перейти к сообщению
Серву повернуть на определённый угол можно чем угодно, хоть с помощью фотосенсора, а вот двигатель повернуть на определенный(!!!) угол.... это фантастика Голливудская улыбка
3. rembytex - 17 Января, 2014 - 00:21:49 - перейти к сообщению
Роботов, ну задержку можно же сделать, почему нельзя сделать кратковременную работу движка, допустим время работы двигателя равно 10 миллисекундам, за это время он повернулся на N-градусов(условно (числом подгоняем до нужного угла, тем более редуктор)), ну как-то так, может не доступно объяснил...
4. Vladimir72 - 17 Января, 2014 - 01:33:11 - перейти к сообщению
rembytex это тебе не шаговый двигатель, возьми ШД и не мучайся, будут тебе и шаги и градусы. Или серву Роботов тебе подсказал.
5. Роботов - 17 Января, 2014 - 09:06:21 - перейти к сообщению
...не, ну если редуктор с приличным коэффициентом, тогда конечно можно и временными задержками. А если на выходной вал редуктора поставить обратную связь в виде потенциометра или энкодера, то... серва получается Голливудская улыбка
6. rembytex - 17 Января, 2014 - 11:59:59 - перейти к сообщению
Vladimir72,Роботов?], так с шаговым всё было бы проще, просто в моём случае там стоит движок, переделка затруднительна... Грустный . Так как насчет временных задержек, может кто-нибудь поможет горемыке?

CODE:
int analogPin = 0; // здесь фоторезистор
int loadPin_CW = 22; // здесь нагрузка
int loadPin_CCW = 23; // здесь нагрузка
int val = 0; // переменная для хранения значения входного напряжения

void setup()
{
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
digitalWrite(22, LOW);
digitalWrite(23, LOW);
}

void loop()
{
val = analogRead(analogPin); // считываем значение с фоторезистора
static uint32_t millis_prev, millis_off; //2 переменные для хранения меток времени
if (val <= 300) // напруга на делителе (подбирается)
{
if(millis()-millis_prev >= 5000) // проверяем что уровень держится >= 5 cек.
{
digitalWrite(loadPin_CW, HIGH); // мотор по часовой
digitalWrite(loadPin_CCW, LOW); // мотор по часовой
millis_off = millis();
}
}
else
millis_prev = millis();
if (millis()-millis_off >= 5000)
{
digitalWrite(loadPin_CW, LOW); // мотор против часовой
digitalWrite(loadPin_CCW, HIGH); // мотор против часовой
}
}


Вот как сделать чтобы в одну сторону движок вращался (условно 1 сек) и тоже самое вдругую?

На данном этапе у меня светло в одну сторону постоянно, темно - в другую Тащусь
7. Vladimir72 - 17 Января, 2014 - 16:07:52 - перейти к сообщению
какую задачу выполняет устройство? кроме поворота в разные стороны, и какая точность тебе нужна. фото есть?
8. rembytex - 17 Января, 2014 - 20:29:38 - перейти к сообщению
Фото нет, т.к. нахожусь в командировке, в наличие Ардуино Мега и всё остальное - в одну сторону 90` обратно тоже 90`, т.е. туда - обратно 90`, короче по типу дампера, точность +/- 5-10`.
Может как-то через библиотеку еепром, туда впихнуть данные временных задержек, но не могу пока сообразить как Ламер
9. selitra - 22 Января, 2014 - 01:17:27 - перейти к сообщению
rembytex
а не мог бы побольше инфы кинуть по своей схеме? мне для проекта в коллегии нужно что-то похожее, а точнее управление оконными ролетами. там тоже всё реализовано на ардуино + фоторезистор + L293D. сам осилить не смог прогамму, начал искать что то похожее, наткнулся на эту тему. тока программа у меня не заработала =( если не жалко покажи как реализована схема.
10. Петр Киселев - 22 Января, 2014 - 19:42:07 - перейти к сообщению
На мой взгляд, можно и двигателем повернуть то, что надо на нужный угол. Просто берется двигатель постоянного тока с энкодером. Далее ставится редуктор, и с вала забирается вращающий момент на требуемый угол.
(Добавление)
Правильно Vladimir72 задает вопрос.
Не зная задачи, можно умучиться с предположениями!
Смотря какое усилие необходимо автору. Может серва или ШД просто не потянут.
(Добавление)
Кстати, есть мотор-редукторы с энкодерами на валу электродвигателя.
11. morokoriss - 22 Января, 2014 - 20:22:22 - перейти к сообщению
А я думаю, что лучше потенциометр, с ним проще. На него одеть шестерню, подходящую по профилю зуба к какой-нибудь шестерни редуктора и через analogread снять показания потенциометра соответствующие нужным углам поворота и указать в программе тормозить двигатель при достижении этих значений. С энкодером возни больше и программа сложнее.
Вот, почти готовый скетч уже есть

/*
* AnalogInput
* by DojoDave <http://www.0j0.org>
*
* включает и выключает светодиод, подключённый к digital
* pin 13. Время задержки между включением и выключением
* светодиода зависит от величины, полученной от функции
* analogRead().
* В самом простом случае – получить аналоговое значение можно
* считывая напряжение с потенциометра, подключённого к
* to analog pin 2.
*
* http://www.arduino.cc/en/Tutorial/AnalogInput
*/

int potPin = 2; // потенциометр подключается к 2-му порту
int ledPin = 13; // светодиод подключается к digital pin 13
int val = 0; // переменная для хранения значения входного напряжения

void setup() {
pinMode(ledPin, OUTPUT); // настраиваем ledPin как выход
}

void loop() {
val = analogRead(potPin); // считываем значение с потенциометра
digitalWrite(ledPin, HIGH); // зажигаем светодиод
delay(val); // задержка, зависит от значения
digitalWrite(ledPin, LOW); // гасим светодиод
delay(val); // опять задержка
}

Только вместо светодиода будет мотор. Ну и дописать опрос фотодатчика.
12. morokoriss - 22 Января, 2014 - 23:40:55 - перейти к сообщению
Ессно двигатель шимить, что тоже не проблемма. Ну по обстоятельствам, так думаю проще всего будет. Я экспериментировал с поворотом головы робота таким образом, когда сервы не было, неплохо получается, достаточно точно.
(Добавление)
А вот в случае с ролетами не прокатит так. Там много оборотов будет, пока размотается полностью, никакого потенциометра не хватит. Или энкодер или только засекать 2 положения, открыто/закрыто с помощью концевиков каких-нибудь.
13. selitra - 23 Января, 2014 - 02:09:16 - перейти к сообщению
Ну я и думал ставить герконы на концах и с магнитиками баловаться, но для начала хочу без герконов запустить, потом думаю в программу добавить часть кода будет легче. просто сам не могу осилить написание всей программы с нуля.
14. cjA - 23 Января, 2014 - 06:07:08 - перейти к сообщению
rembytex, а почему у тебя int analogPin = 0; в сетап не учавствует? И val нужно static раз вне main.

Вот охота тебе дуиноСи учить, когда на этой плате можно и на обычном Си? (Нет, я понимаю что это приноравливает ...)

Помоему задача чисто логическая. что такое millis() ? не проще ли sttic int count=0; ? Как все делают?
(Добавление)
selitra, ну видишь, не совсем такая задача. У ТС +-90' (мне как раз тоже это интересно)- это положение резюка, ток на ADC, все правильно, а у тебя обороты считать- это герконы и совсем другая тема.
15. Петр Киселев - 23 Января, 2014 - 12:19:06 - перейти к сообщению
Ребята, ну чего здесь копья ломать? Роботов предложил ведь использовать серву!
Во многих случаях проще всего реализовать получение+- 90 градусов.
Конечно, если не вмешается Его Величество мощность!