roboforum.ru

Технический форум по робототехнике.

Arduino новичку)

Re: Arduino новичку)

Павел_Сергеевич » 18 мар 2014, 12:20

я не правильно формулирую свои мысли, не частота считывания, а частота считываемого сигнала, вроде как: если частота на входе 400-500гц то полный ход левому двигателю вперед 0.01сек. если 550-650 то правому двигателю полный ход вперед 0.01сек... и так далее

Re: Arduino новичку)

Myp » 18 мар 2014, 13:42

открывай <SoftModem.h> и ищи там modem.read

Добавлено спустя 14 минут 31 секунду:
ааа, понял, ты про другое.
это софт модем, это не частотная передача команд, там нет такого разделения 550 Гц - правый мотор.

с телефона передаётся команда текстовая, например "полный ход левому двигателю вперед 0.01сек", ардуина принимает эту команду и включает нужный мотор на нужное время.
ты сам должен написать как именно ардуина будет реагировать на твои команды.
слушать команды и шевелить ножками в соответсвии с ними

Re: Arduino новичку)

Павел_Сергеевич » 18 мар 2014, 13:52

да-да! именно так! примеры? с чего передерать, где об этом почитать? :Yahoo!: :D

Re: Arduino новичку)

Myp » 18 мар 2014, 15:01

это не надо передирать, это надо понимать и самостоятельно реализовать.

вот например http://habrahabr.ru/post/208466/
там робот получает команды по UART, у тебя софт модем, что в принципе похоже.

накой чёрт тебе эта передача сигналов по проводам через линейный выход?
это геморрой и убогость.
поставь копеечный блютус модуль и без всяких костылей делай что надо.

Re: Arduino новичку)

Павел_Сергеевич » 18 мар 2014, 20:43

спасибо за еще одну статью, но меня так и не поняли, мозги отдельно не будут, зачем усложнять и удорожать конструкцию, когда телефон будет ездить на платформе. искал статью что раньше читал, так и не нашел. хотелось бы повторить то что сделали америкозы. правда там был не телефон а ноут, но не в этом суть. платформа сама ездила и ореинтировалась при помощи камеры. я понимаю что это ооочень сложно. но нужно с чего то начинать. задача сделать автономный бот а не игрушку на дистанционном управлении.

Re: Arduino новичку)

Radist » 18 мар 2014, 21:03

Кажись я понял, что нужно. Телефон ездит на тележке. На тележке драйвер моторов, два мотор-редуктора, датчики. Рулит ими ардуиина. Но ардуина не мозг, а мозжечок. Мозг - телефон. Задача - связать ардуину и телефон, желательно проводами, чтоб по ним можно было передать 100500 команд (пока 60). Беспроводные интерфейсы (синий зуб, ИК) - не желательны. А поскольку у телефона есть выход на наушники - использовать его.

Я не в курсе, можно ли управлять аудиовыходом, чтобы выдавать туда нолики и единички. Если можно - гуглить по слову bit bang. Если нельзя и можно выдать только звуковой сигнал (синусоида) - другой подход. Забудьте слово dtfm, гуглите частотную модуляцию, а к ардуине надо будет приделать частотный детектор. Но все эти способы суть извращение (пардон за мой французский). Зачем связывать цифровые устройства аналоговым интерфейсом, если можно цифровыми?

Re: Arduino новичку)

Myp » 18 мар 2014, 21:20

Павел_Сергеевич писал(а):но меня так и не поняли, мозги отдельно не будут

да все всё поняли и пытаются отговорить, а ты упёрся в эту идею передачи команд звуком по проводам.

твой мозг - телефон будет лежать на тележке с колёсами
на тележке ещё будет ардуина с блютус приёмником.
телефон общается с ардуиной по блютусу.
расстояние между телефоном - мозгом и ардуиной 1 сантиметр.

блютус стоит 200 рублей.
и не нужен никакой геморрой с софт модемом на ардуино, с написанием программы под андроид с частотной модуляцией.
с паянием переходника между телефоном и ардуиной.

Re: Arduino новичку)

Павел_Сергеевич » 18 мар 2014, 22:23

синусоиду переделать в цифру легко, достаточно поставить триггер шмитта. можно и цифрой, если подсоединить там где вход для компа на телефоне. но для меня это совсем темный лес. блютуз тоже вариант. но это дополнительный расход энергии. да и денег. я не уперся, просто так логичнее. хотя через разъем под шнур компа в телефоне было бы вообще идеально, но это надо быть крутым программистом. эх. опять расходы на блютуз.... у меня есть для компа пару флешек блютуз, их бы переделать..

Re: Arduino новичку)

leprud » 18 мар 2014, 22:39

Для таких передач идеально подойдет PPM от RC моделей. Бонусом куча готовых проектов для обеих сторон уравнения

Re: Arduino новичку)

Myp » 18 мар 2014, 23:20

проектов и исходников море, дерзай)))

Re: Arduino новичку)

Павел_Сергеевич » 19 мар 2014, 00:20

а можно ссылочки, а то я что то не нахожу, может не там ищу. точнее проекты нахожу а вот исходники.

Re: Arduino новичку)

leprud » 19 мар 2014, 09:25

дык : "ppm decoder arduino"
пара десятков проектов будет. с исходниками, конечно же

Re: Arduino новичку)

Павел_Сергеевич » 19 мар 2014, 11:53

Ура! кажется нашел! спасибо Leprud! :Yahoo!: и еще, у меня предложение к тем кто пишет программы. может создать отдельную ветку, вроде учебника с наглядным пособием, есть отличное видео которое я выложил в самом начале темы, что то подобное, описание устройства, схема подключения и скетч к нему, с подробным описанием, что какая строчка делает. это тем кому не лень этим заняться, не обязательно специально писать проекты, а свои старые дополнить пояснениями и выложить. будет хорошая база. как учебная так и материальная.

Re: Arduino новичку)

Myp » 19 мар 2014, 20:50

опять не с той стороны мыслишь.
не надо никаких подробных описаний к проектам тем более построчных описаний.
это ведёт лишь к умножению числа дураков, которые без подсказки не способны мигать светодиодом
надо просто изучать азы и тогда любой проект который ты откроешь ты будешь понимать.

Re: Arduino новичку)

Павел_Сергеевич » 20 мар 2014, 02:01

тогда встречный вопрос, где можно найти нормальную, а лучше хорошую литературу, по программированию ардуино. например у меня с агинским проблемы. как и у большинства нас дураков)

Добавлено спустя 28 минут 31 секунду:
ну поскольку я тоже новечек или тугой старичек, считайте как хотите)) пока есть возможность, по донимаю вас вопросами))

int time[5] = {0,0,0,0,0}; //массив значений задержек
(что сие значит, переведите на русский, задержки в ноль?)
unsigned long previousMillis [5]= {0,0,0,0,0}; //массив значений начала задержки
int led[5] = {0,0,0,0,0}; //массив значений состояния LED
(это я так понял начальное значение, то есть выключены)
int p; //переменная вызова функции pulseLength()
int l; //переменная вызова функции Led()
void setup() // инициализация портов
{
for (int x = 2; x < 7; x++)
{
pinMode(x, INPUT);
}
for (int x = 8; x < 13; x++)
{
pinMode(x, OUTPUT);
(вот тут совсем не понял, если значение от2 до 7 то х=ввод, а если от 8 до13 вывод, а откуда тогда значения? p или l?)
}

}
//********** процедура считывания длительности импульса*********
int pulseLength()
{
for (int x=0; x<5; x++) //задаем номер канала
(то есть каналы переключаются по очереди?)
{
int pulseWidth = pulseIn (x+2, HIGH, 20000); //измеряем длительность импульса, записываем в массив
(измеряем в чем? в килограммах? это герцы, или мили секунды или микро секунды? логичнее микросекунды тога 20000мкС=0.02с)
if (pulseWidth > 1200 || pulseWidth < 1700) time[x] = 0; //присваиваем значение задержки
(если задержка от 0.0012с до 0.0017с то время сигнала равно нулю, просто не горит. я правильно понял?)
if (pulseWidth < 1200) time[x] = 1000; // (если меньше 0.0012 то горим секунду)
if (pulseWidth > 1700) time[x] = 500;// (если больше 0.0017 то горим пол секунды)
}
return p;
}

//****************Процедура обработки LED***********
int Led()
{
for (int x=0; x<5; x++) // номер канала (тут опять опять зачем то задаем переключение каналов без задержки, вопрос тогда как успеет замерить длинну сигнала не известно.)
{
if (time[x] == 0) //если стик в цетральном положении Led включен
{
led[x] = 1;
digitalWrite(x + 8, led[x]); (вот тут совсем не понял, сначала проверяем соответствие равен ли х нулю, потом задаем ему единицу, потом к единице прибавляем ноль и сопоставляем опять с ледх которое равно единице....)
}
else
{
int Millis = millis() - previousMillis[x]; //если нет - находим значение задержки

if ((Millis) > time[x]) //если больше заданного (если милисекунды больше времени х то действия ниже)
{
led[x] = !led [x]; //инвертируем значение состояния Led (то есть лед х не равно лед х?)
digitalWrite(x+8,led[x]); // читаем х+8 и сопоставляем с лед х?)
previousMillis[x] = millis(); //обновляем значение начала задержки
}
}
}
}
//**************** Программа**************
void loop() // программа, применяющая поученные значения
{
p = pulseLength(); //вызываем функцию измерения длительности импульса
l = Led(); //вызываем функцию обработки Led
}

Добавлено спустя 1 минуту 33 секунды:
если у кого то хватит терпения это объяснить, просьба просто скопировать скеч и написать пояснения.

Добавлено спустя 10 минут 37 секунд:
взято отсюда http://forum.amperka.ru/threads/rc-передатчик-и-arduino-uno.1244/ в конце как раз таки код что мне нужно. но с начало надо понять прицеп.

Добавлено спустя 9 минут 27 секунд:
вот еще, извините что заceраю так тему.
то что в скобках это мои комментарии.

#define lmotPWM 10 //Присваеваем имена пинам управления
#define lmotCONT1 9
#define lmotCONT2 8
#define rmotPWM 5
#define rmotCONT1 6
#define rmotCONT2 7
//назначение глобальных переменных
long pulseWidth[3] = {
0,0,0};
void setup()
//настройка вх/вых
{
// Serial.begin(9600);
pinMode(11, INPUT);// (то есть три входа?)
pinMode(12, INPUT);
pinMode(13, INPUT);
for (int i = 5; i <= 10; i++) //(с пятого по десятый выход и переключаются по очереди без паузы.)
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);// (изначально выходы выключены)
}
}
void loop()
{
for (int x=2; x<=4; x++) //измеряем длину импульса (а где указываем что считываем х и с какого входа?)
{
unsigned long z = pulseIn(x, HIGH, 20000); // (поясните строчку)
pulseWidth[x-2] = z; //записываем значения в массив
}
if(pulseWidth[2] != 0 && pulseWidth[0] != 0)// (поясните строчку)
{
if(pulseWidth[0] < 1440 || pulseWidth[0] > 1470)
{
if(pulseWidth[0] < 1440)
{
//Serial.println("B");
digitalWrite(lmotCONT1, 1);
digitalWrite(lmotCONT2, 0);
digitalWrite(rmotCONT1, 1);
digitalWrite(rmotCONT2, 0);
digitalWrite(lmotPWM, 1);
digitalWrite(rmotPWM, 1);

}
if(pulseWidth[0] > 1470)
{
//Serial.println("F");

digitalWrite(lmotCONT1, 0);
digitalWrite(lmotCONT2, 1);
digitalWrite(rmotCONT1, 0);
digitalWrite(rmotCONT2, 1);
digitalWrite(lmotPWM, 1);
digitalWrite(rmotPWM, 1);
}
}
else
{
if(pulseWidth[2] < 1440)
{

//Serial.println("L");
digitalWrite(lmotCONT1, 0);
digitalWrite(lmotCONT2, 1);
digitalWrite(rmotCONT1, 1);
digitalWrite(rmotCONT2, 0);
digitalWrite(lmotPWM, 1);
digitalWrite(rmotPWM, 1);
}
if(pulseWidth[2] > 1470)
{

//Serial.println("R");
digitalWrite(lmotCONT1, 1);
digitalWrite(lmotCONT2, 0);
digitalWrite(rmotCONT1, 0);
digitalWrite(rmotCONT2, 1);
digitalWrite(lmotPWM, 1);
digitalWrite(rmotPWM, 1);
}
}
if(pulseWidth[0] > 1440 && pulseWidth[0] < 1470 && pulseWidth[2] > 1440 && pulseWidth[2] < 1470)
{
//Serial.println("STOP");

digitalWrite(lmotPWM, 0);
digitalWrite(rmotPWM, 0);
digitalWrite(lmotCONT1, 0);
digitalWrite(lmotCONT2, 0);
digitalWrite(rmotCONT1, 0);
digitalWrite(rmotCONT2, 0);

//Serial.println(" ");
/*Serial.print(pulseWidth[0]);
Serial.print(" ");
Serial.print(pulseWidth[1]);
Serial.print(" ");
Serial.print(pulseWidth[2]);
Serial.print(" ");
//Serial.print(pulseWidth[3]);
Serial.print(" ");
//Serial.print(pulseWidth[4]);
Serial.println(" ");*/
}
}
else
{
digitalWrite(lmotCONT1, 0);
digitalWrite(lmotCONT2, 1);
digitalWrite(rmotCONT1, 0);
digitalWrite(rmotCONT2, 1);
digitalWrite(lmotPWM, 0);
digitalWrite(rmotPWM, 0);
}
}


Rambler\'s Top100 Mail.ru counter