小车接口及参数
目录
1、基本参数
通过3.7v锂电池供电,板载升压电路至5V给设备供电
通过N20电机驱动小车前进后退。
2、接口定义
超声波
D2
D3
小车驱动
D4:使能。低电平时关闭两个电机,节电。高电平时可控制电机转动。不用电机时,建议置低;
D5:控制左轮。
D6:控制右轮。
D5、D6通过输入PWM来控制转速和方向。
-
输入的占空比小于50%(即Arduino中PWM输出小于128)时前进
-
输入的占空比大于50%(即Arduino中PWM输出大于128)时后退
-
等于50%(即Arduino中PWM输出大于128)时停止转动。
-
数值偏离128越大,则速度越大
WS2812七彩灯
D7
留有扩展口,可增加RGB灯带。
车底部LED灯
D8:高电平点亮,低电平熄灭
可扩展接口
D9、D10、D11
红外避障
D12:右侧红外避障。无障碍时输出高电平,有障碍时输出低电平,LED指示灯亮起;
D13:左侧红外避障。无障碍时输出高电平,有障碍时输出低电平,LED指示灯亮起;
光敏传感器(寻光实验)
A0、A1:模拟输入,得到明暗值。
四路循迹(底部)
A2~A5:
3、扩展示例
机械手
各舵机合适的角度:
D9:大臂:20-120度,数字越小越往前
D10:小臂:20-140,数字越小越往后
D11:抓手:80~180,数字越小抓得越紧
4、示例程序
蓝牙遥控小车前进后退程序
//通过手机蓝牙等设备连接Arduino,输入F则前进。B后退,L左转。R右转。
#define EN_M1M2 4
#define PWM_M1 5
#define PWM_M2 6
int vol;
//long int t=0;
char BluetoothData;
int lpad_x=0,lpad_y=0,rpad_x=0,rpad_y=0; //control pad values sent from Android device
int M1_speed=0,M2_speed=0,M3_speed=0,M4_speed=0;
int speed_max;
void MOTOR_EN()
{
digitalWrite(EN_M1M2,HIGH);
}
void MOTOR_SLEEP()
{
digitalWrite(EN_M1M2,LOW);
}
void setup() {
// put your setup code here, to run once:
pinMode(PWM_M1, OUTPUT);
pinMode(PWM_M2, OUTPUT);
pinMode(EN_M1M2, OUTPUT);
Serial.begin(9600);
}
void loop() {
if(Serial.available())
{
BluetoothData = Serial.read();
if(BluetoothData=='F')
{
MOTOR_EN();
analogWrite(PWM_M1,100);
analogWrite(PWM_M2,100);
delay(500);
MOTOR_SLEEP();
}
/*--------------------------R_pad -----------------------*/
if(BluetoothData=='B')
{
MOTOR_EN();
analogWrite(PWM_M1,200);
analogWrite(PWM_M2,200);
delay(500);
MOTOR_SLEEP();
}
if(BluetoothData=='R')
{
MOTOR_EN();
analogWrite(PWM_M1,100);
analogWrite(PWM_M2,200);
delay(500);
MOTOR_SLEEP();
}
if(BluetoothData=='L')
{
MOTOR_EN();
analogWrite(PWM_M1,200);
analogWrite(PWM_M2,100);
delay(500);
MOTOR_SLEEP();
}
}
delay(10);
}
光敏传感器控制小车前进后退(测试用,需手持小车)
//使用光线控制小车前进后退
void setup() {
// put your setup code here, to run once:
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(A1, INPUT);
Serial.begin(9600);
}
//串口发送 L:02R:01,控制左右的车速,各需要两位数
void loop() {
int k = analogRead(A1);
Serial.println(k);
digitalWrite(4,HIGH);
int i = k/4;
int j = k/4;
analogWrite(5, i);
analogWrite(6, j);
}
WS2812灯程序
// 本示例程序适用于3线(电源线,地线,数据线)的WS2812灯条
#include <FastLED.h>
#define NUM_LEDS 3 // 定义 led 数量
#define DATA_PIN 7 // 定义 开发板的IO 3 为数据引脚
CRGB leds[NUM_LEDS]; // 定义CRGB的led等数组
void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
}
void loop() {
// 第一个led灯闪烁白色
leds[0] = CRGB::White; // 序号为0的led设置白色,点亮
FastLED.show();
delay(500);
leds[0] = CRGB::Black; // 序号为0的led设置黑色,熄灭
FastLED.show();
delay(500);
delay(500);
// 每一个led逐个闪烁绿色
for(int i = 0; i < NUM_LEDS; i++ ) {
leds[i] = CRGB::Green;
FastLED.show();
delay(100);
leds[i] = CRGB::Black;
FastLED.show();
delay(100);
}
delay(1000);
// 整个灯条 彩虹色渐变
int h = 0;
for(int j = 0; j< 255; j++) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV( (h + (255 / NUM_LEDS) * i), 255, 255); //用HSV色彩空间,不断改变H即可
FastLED.show();
}
delay(1);
h = (h + 2) % 255;
}
// 整个灯条熄灭
for(int i = 0; i < NUM_LEDS; i++ ){
leds[i] = CRGB::Black;
}
FastLED.show();
delay(1000);
}
机械手调试程序
//通过串口分别输入三个数字,逗号隔开,如:60,90,90,分别是大臂、小臂和抓手的角度
#include <Servo.h>
Servo myservo1;
Servo myservo2;
Servo myservo3;
String comdata="";
String part01 = "";
String part02 = "";
String part03 = "";
void setup() {
myservo1.attach(9);
myservo2.attach(10);
myservo3.attach(11);
Serial.begin(9600);
}
void loop() {
ReceiveWifiMessage();
if(comdata.length()!=0){
Serial.println(comdata);
String part01 = fenge(comdata, ",", 0);
String part02 = fenge(comdata, ",", 1);
String part03 = fenge(comdata, ",", 2);
int a = part01.toInt();
int b = part02.toInt();
int c = part03.toInt();
Serial.println(part01);
Serial.println(part02);
Serial.println(part03);
myservo1.write(a);
myservo2.write(b);
myservo3.write(c);
}
}
//*********************** 接收串口数据 *******************************
void ReceiveWifiMessage(){
comdata="";
while (Serial.available() > 0 )
{
comdata+=char(Serial.read());
delay(2);
}
}
//************************ 分割函数 **********************************
String fenge(String str,String fen,int index)
{
int weizhi;
String temps[str.length()];
int i=0;
do
{
weizhi = str.indexOf(fen);
if(weizhi != -1)
{
temps[i] = str.substring(0,weizhi);
str = str.substring(weizhi+fen.length(),str.length());
i++;
}
else {
if(str.length()>0)
temps[i] = str;
}
}
while(weizhi>=0);
if(index>i)return "-1";
return temps[index];
}