|
本帖最后由 41257203 于 2013-12-16 15:17 编辑
先来看下硬件:
车体使用洞洞板
电机:6V-24V宽电压大扭力电机,具体有多大力气看视频就知道了!
轮子:1:8大脚车的轮子115mm直径,爬坡上马路一点问题都没有
路由:151-3G已经焊好TTL接口但是TX接口不能接单片机,一接就重启,还好发送数据的接口没有问题。如果要使用rx和tx的话就需要USB数据线连到单片机,可以参考我的另一篇文章:http://www.wifi-robots.com/thread-6409-1-1.html
电机驱动模块:L298N 1个
单片机:arduino nano(超小,但功能不弱)
电池:6200ma 12V
整车供电系统由12V电池供电,路由由一块坏掉的L298N供电,单片机由另一片L298N供电,所以在视频中会看到有2个L298N
由于摄像头坏了就没有放上去,路由已刷好支持UVC摄像头,理论上可以支持市面上的大部分UVC高清摄像头(例如:D881 720p高清 才70块)
不足的地方就是电源打开后路由向单片机发送了大量数据包,由于不会写延时程序所以要等路由开机完后,需要再按下arduino nano上的reset 才可以开始控制!
此车有意300出售,差不多 花了600多的成本学习了,不想再搞下去了,换点rmb搞四轴去了,现在四轴也烂尾在哪了。
有意的话加QQ:41257203
下面是视频和下位机程序:
视频:
程序:
#include <Servo.h>
#define BAUDRATE 9600
Servo servo1;//定义舵机1
Servo servo2;//定义舵机2
//L298N_A
int M1_1 = 2;
int M1_2 = 3;
//L298N_B
int M2_1 = 8;
int M2_2 = 9;
int buffer[3];
int Serial_flag;
int temp_char;
int date_index=0;
void setup()
{
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
servo1.attach(6);//定义舵机1控制接口为数字6
servo2.attach(7);//定义舵机2控制接口为数字7
Serial.begin(9600);
}
void Stop(void) //四轮停止
{
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
}
void advance(int x) //向前直行
{
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
}
void back(int x) //向后直行
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
}
void left(int x) //左转
{
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
}
void right(int x) //右转
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
}
void Communication_Decode()
{
if(buffer[0]==0x00)
{
switch(buffer[1])
{
case 0x01:advance(150);return;
case 0x02:back(150);return;
case 0x03:right(150);return;
case 0x04:left(150);return;
case 0x00:Stop(); return;
}
}
else if(buffer[0]==0x01)
{
if(buffer[2]>180)return;
switch(buffer[1])
{
case 0x01:servo1.write(buffer[2]);return;
case 0x02:servo2.write(buffer[2]);return;
default:return;
}
}
}
void loop()
{
if(Serial.available() > 0)
{
temp_char = Serial.read();
if(temp_char!=-1)
{
if(Serial_flag==0)
{
if(temp_char==0xff)
{
Serial_flag = 1;
}
}
else
{
if(temp_char==0xff)
{
Serial_flag = 0;
if(date_index==3)
{
Communication_Decode();
}
date_index = 0;
}
else
{
buffer[date_index]=temp_char;
date_index++;
}
}
}
}
}
|
|