magiccar 發表於 2015-9-23 23:09

轉貼:用無線遊戲把手遙控mBot

Makeblock 的 USB Host 轉串列通信模組是一個讓 Arduino 可外接USB滑鼠或者其它HID設備的電子模組。有了它,我們可以為 mBot 增加新的控制方式——無線遊戲手柄遙控。
http://bbs.makeblock.cc/data/attachment/forum/201508/15/200111xs00h92xrc26ez40.gif
資料來源:bbs.makeblock.cc/thread-706-1-1.html
準備材料:
1、mBot套件x1
2、Me USB Host模組 參考說明
3、無線2.4G遊戲把手x1

http://bbs.makeblock.cc/data/attachment/forum/201508/15/191141vo1ymdvlto0fzd9w.jpg
USB Host的特點:
1、USB主控晶片是的CH375B
2、支援描述位元符小於64 Byte的HID設備
3、默認鮑率是9600

由於 mBot 的主控板 mCore 硬體序列埠沒有提供RJ25接口,所以範例程式使用軟體序列埠來實現與 USB Host 通訊。
控制過程 mCore <--> USB Host <--> USB 2.4G Dongle <--> Wireless Joystick
                  |
                  |
            直流馬達
http://bbs.makeblock.cc/data/attachment/forum/201508/15/191354cm3lxed3u4e37h11.jpg

先簡單測試一下控制馬達正反轉

http://bbs.makeblock.cc/data/attachment/forum/201508/15/182144j6aw1zn6nv6tdnyi.gif

#include "MeUsb.h"//引用USB Library
MeUsb usb(10,9); //指定串口tx,rx引脚

void setup()
{
   Serial.begin(9600);
   usb.init(USB1_0);//初始化USB Host
}

void loop()
{
if(!usb.device_online)
{
    usb.probeDevice(); //輪詢USB設備
    delay(100);
}
else
{
//接收USB設備的資料
    int len = usb.host_recv();
    if(len>4){
      parseJoystick(usb.RECV_BUFFER);
    }
}
}
void parseJoystick(unsigned char * buf)
{
//解析手把的資料
uint8_t buttonCode = buf&0xff;
uint8_t buttonCode_ext = buf&0xff;
uint8_t joystickCodeL_V = buf&0xff; //top 0 bottom ff
uint8_t joystickCodeL_H = buf&0xff; //left 0 right ff
uint8_t joystickCodeR_V = buf&0xff; //top 0 bottom ff
uint8_t joystickCodeR_H = buf&0xff; //left 0 right ff
uint8_t directionButtonCode = (buttonCode&0xf);
uint8_t rightButtonCode = (buttonCode&0xf0)>>4;
switch(directionButtonCode){
   ...
    case 2:{
      //right
//控制馬達右轉
      runMotor(MOTOR_1,100);
      runMotor(MOTOR_2,100);
      break;
    }
   ...
    case 6:{
      //left
//控制馬達左轉
      runMotor(MOTOR_1,-100);
      runMotor(MOTOR_2,-100);
      break;
    }
    ...
    default:{
      // release;
      runMotor(MOTOR_1,0);
      runMotor(MOTOR_2,0);
    }
}
}

void runMotor(int motor,int speed){
//馬達驅動
int _dirPin;
int _pwmPin;
if(motor==MOTOR_1){
    _dirPin = 7;
    _pwmPin = 6;
}else if(motor==MOTOR_2){
    _dirPin = 4;
    _pwmPin = 5;
}
pinMode(_dirPin,OUTPUT);
pinMode(_pwmPin,OUTPUT);
digitalWrite(_dirPin,speed>0);
analogWrite(_pwmPin,abs(speed));
}

http://bbs.makeblock.cc/data/attachment/forum/201508/15/200237ugvvgyvezzhvyvkw.jpg
下載小車運動控制完整程式




頁: [1]
查看完整版本: 轉貼:用無線遊戲把手遙控mBot