ROBOCAT на Iskra JS

Тема в разделе "Глядите, что я сделал", создана пользователем sys, 9 авг 2016.

  1. sys

    sys Злобный Буратино Модератор

    Предыстория тут.

    DSCN6110.JPG.jpg



    Сырой прототип робокота, управляемый с ИК-пульта для отладки двигательных и прочих функций (ну и по совместительству временное решение по развлечению детишек), который пока и умеет что ездить, вертеть головой, играть RTTL-мелодии и светить им в такт светодиодами...

    На будущее - автоматизация с задействованием датчиков окружения, ШИМ для регулирования скорости двигателей, ну и программирование ИИ :)

    Состав:
    2-х колесное шасси с 6В двигателями и колесной опорой,
    корпус из структора,
    основная плата Iskra JS,
    драйвер моторов L298N,
    плата расширения Troyka-shield,
    ИК-приемник,
    пьезодинамик,
    сервомотор,
    ультразвуковой дальномер (в данный момент пока не используется),
    фоторезистор (в данный момент пока не используется),
    датчик шума (в данный момент пока не используется).

    DSCN6121.JPG.jpg DSCN6123.JPG.jpg DSCN6122.JPG.jpg DSCN6119.JPG.jpg DSCN6116.JPG.jpg DSCN6111.JPG.jpg
    Код (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();              
        }
      }
    });

    По мере развития проекта буду делиться здесь новыми успехами :)
     
    Последнее редактирование: 9 авг 2016
    OldKryptos, issaom, NICK48 и 2 другим нравится это.
  2. kotboriska1

    kotboriska1 Нуб

    Привет, покажи пожалуйста поподробней внутренности Робокэта, а то проект классный, а как подключать моторы и шлейфы к Troyka-Shield не как не могу понять. ну заранее спасибо. Классный проект!!!
     
  3. sys

    sys Злобный Буратино Модератор

    Спасибо за оценку! В спойлере есть код, в комментариях которого указаны соединения пинов шилда и драйвера моторов. На данный момент проект переделан под моторшилд от Амперки. Фоток старого соединения нет, но если еще надо могу попробовать нарисовать.
     
  4. kotboriska1

    kotboriska1 Нуб

    А можно фотки нового Робокэта?
     
  5. NICK48

    NICK48 Нуб

    Подскажи пожалуйста ,собрал похожий проект Робоняша (искра,мотор шилд,тройка шилд) работает через пульт от Йода ,как сделать чтобы при нажатии кнопки он двигался а при отжатии останавливался ?А то уменя чтобы его остоновить надо нажать другую кнопу. Зарание спасибо !!!
     
  6. sys

    sys Злобный Буратино Модератор

    на вид не поменялся, только в задней нише вместо драйвера моторов пустота пока.

    В коде в теме под спойлером есть участок кода
    Код (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) происходит постоянная подача импульса на нужные пины драйвера моторов, а при отпускании кнопки соответственно прекращается... На амперковском моторшилде не экспериментировал такое с пультом, т.к. решил изначально сделать упор на автоматику и ШИМ, но так и не доделал пока.... последнее время не до нее - стоит на полке, смотрит на меня с укоризной и ждет своего часа :)
     
    NICK48 нравится это.
  7. NICK48

    NICK48 Нуб

    Спасибо за ответ! значит будем дельше эксперементировать )))
     
  8. sys

    sys Злобный Буратино Модератор

    Можно попробовать не использовать библиотеку для моторшилда, а управлять напрямую:
    • 4 — направление, правый
    • 5 — скорость (ШИМ), правый
    • 6 — скорость (ШИМ), левый
    • 7 — направление, левый
    на 4 и 7 пины подавать 0 или 1 в зависимости от направления, а на 5 и 6 подавать импульс для движения...
     
  9. NICK48

    NICK48 Нуб

    Надо будет попробывать! А неподскажешь можно парктроник с пульта отключать?
     
  10. sys

    sys Злобный Буратино Модератор

    Если Вы про 16й урок Йодо, то можете использовать следующий прием:
    создаете переменную для хранения идентификатора интервальной функции (например, iid)
    var iid;

    Далее создаете функцию и запихиваете setInterval из урока в нее с помощью конструкции

    function ParkTrig(){
    iid=setInterval(....);
    }


    Добавляете код для ИК где вешаете на одну кнопку включение функции через ее вызов ParkTrig() и, дабы избежать многократного вызова, выключение (с использованием программного триггера) через очистку интервальной функции clearInterval(iid);
     
  11. Platon

    Platon Нерд

    А схема подключения?
     
  12. sys

    sys Злобный Буратино Модератор

    В коде прописано какие пины куда. Разве что не забывать землю прокидывать :)
     
  13. Platon

    Platon Нерд

    Я тут пытаюсь переделать код под управление blutooth, но у меня он не работает, может поможете?
     
  14. sys

    sys Злобный Буратино Модератор

    Если честно, то с синезубом пока не играл...
     
  15. Platon

    Platon Нерд

    //пины подключенные ко входам драйвера моторов 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);
    }
    });
     
  16. OldKryptos

    OldKryptos Гик

    Хвост! Хвоста не хватает! Голосую за хвост! )) Котэ классный!
     
  17. sys

    sys Злобный Буратино Модератор

    Попробуйте проверить работу моторов, подключив напрямую к IDE и используя digitalWrite. Команды поступают постоянно или разово? У меня используется digitalPulse, расчитанный на постоянно поступающий сигнал пока зажата кнопка пульта...
     
  18. sys

    sys Злобный Буратино Модератор

    Спасибо! Учту! :) Проект был переведен на Амперка-моторшилд и снова успешно заброшен на полку. Скоро доберусь до него снова...