Предыстория тут. Сырой прототип робокота, управляемый с ИК-пульта для отладки двигательных и прочих функций (ну и по совместительству временное решение по развлечению детишек), который пока и умеет что ездить, вертеть головой, играть RTTL-мелодии и светить им в такт светодиодами... На будущее - автоматизация с задействованием датчиков окружения, ШИМ для регулирования скорости двигателей, ну и программирование ИИ Состав: 2-х колесное шасси с 6В двигателями и колесной опорой, корпус из структора, основная плата Iskra JS, драйвер моторов L298N, плата расширения Troyka-shield, ИК-приемник, пьезодинамик, сервомотор, ультразвуковой дальномер (в данный момент пока не используется), фоторезистор (в данный момент пока не используется), датчик шума (в данный момент пока не используется). Спойлер: пример кода ИК-управления моторами Код (Javascript): var myReceiver = require('ir-receiver').connect(P7); //пины подключенные ко входам драйвера моторов INx var RF = P9; //IN2 1 - правое колесо вперед var RB = P8; //IN1 1 - правое колесо назад var LF = P10; //IN3 1 - левое колесо вперед var LB = P11; //IN4 1 - левое колесо назад pinMode(RF,'output'); pinMode(RB,'output'); pinMode(LF,'output'); pinMode(LB,'output'); var tpulse = 100; function mdrive(rf,rb,lf,lb){ if(rf){ digitalPulse(RF,rf,tpulse); }else{ digitalWrite(RF,rf); } if(rb){ digitalPulse(RB,rb,tpulse); }else{ digitalWrite(RB,rb); } if(lf){ digitalPulse(LF,lf,tpulse); }else{ digitalWrite(LF,lf); } if(lb){ digitalPulse(LB,lb,tpulse); }else{ digitalWrite(LB,lb); } } //движение вперед function mforward(){ mdrive(1,0,1,0); } //движение назад function mback(){ mdrive(0,1,0,1); } //стоп - при использовании digitalPulse бесполезен function mstop(){ mdrive(0,0,0,0); } //поворот двумя колесами направо function m2right(){ mdrive(0,1,1,0); } //поворот двумя колесами налево function m2left(){ mdrive(1,0,0,1); } //поворот одним колесом направо function mright(){ mdrive(0,0,1,0); } //поворот одним колесом налево function mleft(){ mdrive(1,0,0,0); } //поворот задним ходом одним колесом направо function mrightback(){ mdrive(0,1,0,0); } //поворот задним ходом одним колесом налево function mleftback(){ mdrive(0,0,0,1); } //обработчик ИК-сигналов myReceiver.on('receive', function(code, repeat) { if (repeat) { switch(code){ case 378101919: mforward(); break; case 378124359: mback(); break; case 378116199: mright(); break; case 378081519: mleft(); break; case 378099879: m2right(); break; case 378097839: m2left(); break; case 378085599: mrightback(); break; case 378083559: mleftback(); } } }); По мере развития проекта буду делиться здесь новыми успехами
Привет, покажи пожалуйста поподробней внутренности Робокэта, а то проект классный, а как подключать моторы и шлейфы к Troyka-Shield не как не могу понять. ну заранее спасибо. Классный проект!!!
Спасибо за оценку! В спойлере есть код, в комментариях которого указаны соединения пинов шилда и драйвера моторов. На данный момент проект переделан под моторшилд от Амперки. Фоток старого соединения нет, но если еще надо могу попробовать нарисовать.
Подскажи пожалуйста ,собрал похожий проект Робоняша (искра,мотор шилд,тройка шилд) работает через пульт от Йода ,как сделать чтобы при нажатии кнопки он двигался а при отжатии останавливался ?А то уменя чтобы его остоновить надо нажать другую кнопу. Зарание спасибо !!!
на вид не поменялся, только в задней нише вместо драйвера моторов пустота пока. В коде в теме под спойлером есть участок кода Код (Javascript): var tpulse = 100; function mdrive(rf,rb,lf,lb){ if(rf){ digitalPulse(RF,rf,tpulse); }else{ digitalWrite(RF,rf); } if(rb){ digitalPulse(RB,rb,tpulse); }else{ digitalWrite(RB,rb); } if(lf){ digitalPulse(LF,lf,tpulse); }else{ digitalWrite(LF,lf); } if(lb){ digitalPulse(LB,lb,tpulse); }else{ digitalWrite(LB,lb); } } засчет импульса в 100 мс (экспериментально подбирал для драйвера моторов L298N) при удержании кнопки (ИК режим repeat) происходит постоянная подача импульса на нужные пины драйвера моторов, а при отпускании кнопки соответственно прекращается... На амперковском моторшилде не экспериментировал такое с пультом, т.к. решил изначально сделать упор на автоматику и ШИМ, но так и не доделал пока.... последнее время не до нее - стоит на полке, смотрит на меня с укоризной и ждет своего часа
Можно попробовать не использовать библиотеку для моторшилда, а управлять напрямую: 4 — направление, правый 5 — скорость (ШИМ), правый 6 — скорость (ШИМ), левый 7 — направление, левый на 4 и 7 пины подавать 0 или 1 в зависимости от направления, а на 5 и 6 подавать импульс для движения...
Если Вы про 16й урок Йодо, то можете использовать следующий прием: создаете переменную для хранения идентификатора интервальной функции (например, iid) var iid; Далее создаете функцию и запихиваете setInterval из урока в нее с помощью конструкции function ParkTrig(){ iid=setInterval(....); } Добавляете код для ИК где вешаете на одну кнопку включение функции через ее вызов ParkTrig() и, дабы избежать многократного вызова, выключение (с использованием программного триггера) через очистку интервальной функции clearInterval(iid);
//пины подключенные ко входам драйвера моторов INx var RF = P9; //IN2 1 - правое колесо вперед var RB = P8; //IN1 1 - правое колесо назад var LF = P10; //IN3 1 - левое колесо вперед var LB = P11; //IN4 1 - левое колесо назад pinMode(RF,'output'); pinMode(RB,'output'); pinMode(LF,'output'); pinMode(LB,'output'); var tpulse = 100; function mdrive(rf,rb,lf,lb){ if(rf){ digitalPulse(RF,rf,tpulse); }else{ digitalWrite(RF,rf); } if(rb){ digitalPulse(RB,rb,tpulse); }else{ digitalWrite(RB,rb); } if(lf){ digitalPulse(LF,lf,tpulse); }else{ digitalWrite(LF,lf); } if(lb){ digitalPulse(LB,lb,tpulse); }else{ digitalWrite(LB,lb); } } //движение вперед function mforward(){ mdrive(1,0,1,0); } //движение назад function mback(){ mdrive(0,1,0,1); } //поворот двумя колесами направо function m2right(){ mdrive(0,1,1,0); } //поворот двумя колесами налево function m2left(){ mdrive(1,0,0,1); } //поворот одним колесом направо function mright(){ mdrive(0,0,1,0); } //поворот одним колесом налево function mleft(){ mdrive(1,0,0,0); } //поворот задним ходом одним колесом направо function mrightback(){ mdrive(0,1,0,0); } //поворот задним ходом одним колесом налево function mleftback(){ mdrive(0,0,0,1); } Serial3.setup(9600); var bt = require('@amperka/bluetooth').connect({ serial: Serial3, speed: 9600, kPin: P3, lineEnding: '\r\n' }); // если пришли данные на Bluetooth PrimarySerial.on('data', function (dataIn) { print(dataIn); if (dataIn === 'F') { // если пришла команда "F" // едем вперёд mdrive(1,0,1,0); } else if (dataIn === 'B') { // или если пришла команда "B" // едем назад mdrive(0,1,0,1); } else if (dataIn === 'L') { // или если пришла команда "L" // поворачиваем налево на месте mdrive(1,0,0,1); } else if (dataIn === 'R') { // или если пришла команда "R" // поворачиваем направо на месте mdrive(0,1,1,0); } });
Попробуйте проверить работу моторов, подключив напрямую к IDE и используя digitalWrite. Команды поступают постоянно или разово? У меня используется digitalPulse, расчитанный на постоянно поступающий сигнал пока зажата кнопка пульта...
Спасибо! Учту! Проект был переведен на Амперка-моторшилд и снова успешно заброшен на полку. Скоро доберусь до него снова...
Здравствуйте, можно узнать почему выдаётся эта ошибка(на картинке), есле для парктроника всё правильно прописано(как в книжке)