Notice: unserialize(): Error at offset 3920 of 5063 bytes in /var/www/vhosts/rus-robots.ru/4robots.ru/plugins/aceadminpanel/config/config.custom.php on line 23 Радиоуправляемая платформа на Arduino (Transceiver nRF24L01+) / Блог им. John / LiveStreet - бесплатный движок социальной сети

Радиоуправляемая платформа на Arduino (Transceiver nRF24L01+)

 

Давно хотел собрать радиоуправляемого робота и заодно проверить возможности платформы на колеса.  Вот что получилось. Центральное колесо подобрал в магазине ОБИ. Так как радио модуль и драйвер двигателя требуют слишком много цифровых портов, решил расширить количество цифровых портов с помощью I2C 16-портовым расширителем. На видео снял только как это платформа поворачивает. Пульт управления собран на Arduino Fio (очень удобно, заряжать LiPo аккумулятор) Cама платформа собрана на Arduino Pro 3.3V. 




Ссылка на крупное фото





Код для платформы.


/********************************************
 **   SPI                                   *
 **   +CS   - to digital pin 8              *
 **   +CSN  - to digital pin 9  (SS pin)    *
 **   +MOSI - to digital pin 11 (MOSI pin)  *
 **   +MISO - to digital pin 12 (MISO pin)  *
 **   +CLK  - to digital pin 13 (SCK pin)   *
 **   +IRQ  - to 10                         *
 *******************************************/

#include <Wire.h>
#include "IOexpander.h"
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

// motor A connected between A01 and A02
// motor B connected between B01 and B02

int STBY = 3; //standby

// Motor A

   int PWMA = 6;  //Speed control 
   int AIN1 = 2;  //Direction
// int AIN2 = MCP23016 GP0,0

//Motor B

   int PWMB = 5; //Speed control
   int BIN1 = 4; //Direction
   int BIN2 = 7; //Direction
   
IOexpander IOexp;  //  MCP23016

byte lastCommand = 'N';

int speed = 64; 

/* --------------------------------- setup -------------------------------------- */

void setup() {
   
  Wire.begin();  // MCP23016
  
   if(IOexp.init(0x20, MCP23016)) {
    IOexp.pinMode(1,0,OUTPUT);      // Init LED
    IOexp.pinMode(1,1,OUTPUT);      // Init LED
    
    IOexp.pinMode(0,7,OUTPUT);      // Init LED
    IOexp.pinMode(0,6,OUTPUT);      // Init LED
    
    IOexp.digitalWrite(1,0,LOW);    // RED     
    IOexp.digitalWrite(1,1,HIGH);   // GREEN
    
    
    IOexp.digitalWrite(0,7,LOW);    // RED     
    IOexp.digitalWrite(0,6,HIGH);   // GREEN
    
    delay(1000);
    IOexp.digitalWrite(1,1,LOW);    // LED RED
    IOexp.digitalWrite(1,0,LOW);    // LED GREEN     
  } 
  
  pinMode(STBY, OUTPUT);

  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  IOexp.pinMode(0,0,OUTPUT);   // pinMode(AIN2, OUTPUT);

  pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  
  
  Mirf.spi = &MirfHardwareSpi;
  Mirf.csnPin = 9;
  Mirf.cePin   = 8;
    
  Mirf.init();
  Mirf.setRADDR((byte *)"serv1");
  Mirf.payload = sizeof(byte);
  Mirf.config();

  IOexp.digitalWrite(1,0,LOW);   // RED     
  IOexp.digitalWrite(1,1,HIGH);  // GREEN
  
}

void loop() {
  
  byte data[Mirf.payload];
  
  if (!Mirf.isSending() && Mirf.dataReady()) {    
   
   Mirf.getData(data);  
   
   if (data[0] == lastCommand) {
    speed =  speed + 64; 
    if (speed > 255 )  { speed = 255; }
   }
   
   lastCommand = data[0]; // --- Для увиличения скорости ---  
   
  }
    
    switch (data[0]) {
      
      case 'B':
       stop();
       RED();
       forward(speed);
       data[0] = '\0';
      break;
      
      case 'D':
       stop();
       GREEN();
       reverse(speed);
       data[0] = '\0';
      break;
      
      case 'C':
       stop();
       GREEN_LR();
       left(speed);
       data[0] = '\0';       
      break;
       
      case 'E':
       stop();
       RED_LR();
       right(speed);
       data[0] = '\0';       
      break;  
      
      case 'F':
       stop();
       speed=64;
       all_off();
       data[0] = '\0';       
      break;  

    }
 
}

void move(int motor, int speed, int direction){
  
// Move specific motor at speed and direction
// motor: 0 for B 1 for A
// speed: 0 is off, and 255 is full speed
// direction: 0 clockwise, 1 counter-clockwise

  digitalWrite(STBY, HIGH); // Standby OFF

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if(direction == 1){
    inPin1 = HIGH;
    inPin2 = LOW;
  }

  if(motor == 1){
    digitalWrite(AIN1, inPin1);
    IOexp.digitalWrite(0,0,inPin2);     // digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, speed);
    
  }else{
    digitalWrite(BIN1, inPin1);
    digitalWrite(BIN2, inPin2);
    analogWrite(PWMB,  speed);
  }
}

void right(int speed) {
 move(1, speed, 0);
 move(2, speed, 0); 
}

void left(int speed) {
 move(1, speed, 1);
 move(2, speed, 1); 
}

void reverse(int speed) {
 move(1, speed, 1);
 move(2, speed, 0); 
}

void forward(int speed) {
 move(1, speed, 0);
 move(2, speed, 1); 
}


void stop() { 
  digitalWrite(STBY, LOW); // Standby On
}

void RED() {
  IOexp.digitalWrite(1,0,HIGH);   // RED     
  IOexp.digitalWrite(1,1,LOW);    // GREEN
}  

void GREEN() {
  IOexp.digitalWrite(1,0,LOW);   // RED     
  IOexp.digitalWrite(1,1,HIGH);  // GREEN
}

void GREEN_LR() {
  IOexp.digitalWrite(0,7,HIGH);    // RED     
  IOexp.digitalWrite(0,6,LOW);   // GREEN 
}

void RED_LR() {
 IOexp.digitalWrite(0,7,LOW);    // RED     
 IOexp.digitalWrite(0,6,HIGH);   // GREEN
}
    

void all_off() {
 IOexp.digitalWrite(0,7,LOW);        
 IOexp.digitalWrite(0,6,LOW);   
 IOexp.digitalWrite(1,0,LOW);       
 IOexp.digitalWrite(1,1,LOW);  
}

Код для пульта управления.


/*********************************************************************
**   SPI-compatible                                                 **
**   CS - to digital pin 8  (CE)                                    **
**   CSN - to digital pin 9  (SS pin)                               **
**   MOSI - to digital pin 11 (MOSI pin)                            **
**   MISO - to digital pin 12 (MISO pin)                            **
**   CLK - to digital pin 13 (SCK pin)                              **
**   IRQ - to digital pin 10                                        **
*********************************************************************/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

boolean ReadyToSend = false;

int sensorPin = A7;     // Кнопки
int ledPin = 7;         // Лампа нажатия на кнопку
int sensorValue = 0;    // Значение кнопки

void setup() {

  pinMode(ledPin, OUTPUT);  
 
  digitalWrite(ledPin,HIGH); 
  
  Mirf.csnPin = 9;
  Mirf.cePin = 8;
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"clie1");
  Mirf.payload = sizeof(byte);
  Mirf.config();
  
}

// ------------------------------- Main Programm Loop --------------------------

void loop() {
 
  byte data = 65;
  
   sensorValue = analogRead(sensorPin);
   
   if (sensorValue > 0) {
    delay(50);
    sensorValue = analogRead(sensorPin);
    delay(50);
   }
             
   if (sensorValue > 890 && sensorValue <= 900) {  // UP
    digitalWrite(ledPin, LOW);  
    ReadyToSend = true;    
    data = 66;  // B
   } else if (sensorValue > 840 && sensorValue < 890) { // Left
    digitalWrite(ledPin, LOW);  
    ReadyToSend = true;
    data = 67; // C
   } else if (sensorValue  > 795 && sensorValue < 805) { // Down
    digitalWrite(ledPin, LOW);  
    ReadyToSend = true;
    data = 68; // D
   } else if (sensorValue > 950 && sensorValue < 990) { // Right
    digitalWrite(ledPin, LOW);  
    ReadyToSend = true;
    data = 69; // E
   } else if (sensorValue > 770 && sensorValue < 790) { // Right
    digitalWrite(ledPin, LOW);  
    ReadyToSend = true;
    data = 70; // F
   } else {
    digitalWrite(ledPin, HIGH);   
   }

  if (ReadyToSend) {
      
      ReadyToSend = false;
      
      Mirf.setTADDR((byte *)"serv1");
      Mirf.send((byte *)&data);
      
      while(Mirf.isSending()) { } 
      
      delay(100);
  }  
  
}
  • 0
  • 05 декабря 2012, 16:02
  • John

Комментарии (2)

RSS свернуть / развернуть
Привет всем, у меня точно такие же модули и еще много чего набралось.

В плане электроники я Гуру, но в плане программирования как бы это сказать по мягче .....)))))))

Короче буду признателен, если кто нибудь напишет или подскажет скетч для передатчика с двумя потенциометрами и приёмника с двумя сервомеханизмами. Один я как то заставил работать, а вот передать положения двух потенциоментров у меня както голова не варит как? Нужен темплейт!!!

Еще кто нибудь подскажет с чего проще начать изучать язык программирования, да так, чтобы изучить его грамотно и до конца, ато изменяя чужие скетчи далеко не уедешь...?
0
Привет, изучать лучше Язык C — так как на нем сейчас основано практически все.
И начать изучать его лучше с легендарного учебника, который наверно прочли все кто
начинал изучать этот язык lib.ru/CTOTOR/kernigan.txt Керниган, Ричи. Язык C.
Для передачи данных — придумай свой алгоритм — это просто, каждый блок информации, должен иметь заголовок и конец. Для примера посмотри протокол NMEA который используется в GPS устройствах. По этому же принцип можно передавать любую информацию другому устройств, или принимать данные от другого устройства.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
RoboRing.Ru
<< | list | ? | >>