玩转树莓派 树莓派智能小车DIY全过程手机控制循迹避障 包含源码
使用树莓派制作智能小车
使⽤树莓派制作智能⼩车电影⾥,时不时地可以看到⼀些这样的场景,⼀辆⼩车,上⾯装有摄像头,这辆⼩车可以通过电脑或都是⼿机进⾏远程遥控,车上摄像头拍到的画⾯,可以实时地显⽰在电脑或⼿机上,就像下图这样。
没有接触过这⽅⾯的朋友或许会觉得这是⼀门很⾼⼤上的技术活,其实,并不然,这种⼩车做起来其实很简单。
那么,这样⼦的⼩车,需要怎么去做呢?其实,我们只需要准备⼀块控制⼩车的电路板(开发板),2到4个电机(马达)、⼩车架⼦⼀个、摄像头以及摄像头云台⼀个,以上这些基础配件,然后对开发板进⾏编程、控制就可以了,整体硬件成本加起来不到500块钱。
开发板:开发板有很多种,⽐如51单⽚机、树莓派、STM32、Arduino、micro:bit等等,都可以做为⼩车的控制板,我使⽤的是树莓派开发板,然后,可持树莓派有很多版本、型号,最便宜的树莓派zero 68元就可以买到,不过不建议买这种,没有⽹卡,需要另外买⽹线模块,我使⽤的是树莓派3B,价格220元,带有⽆线和有线⽹卡,还带有蓝⽛。
⼩车架⼦:某宝上有很多这种车架⼦,各式各样的,只需要在某宝上搜索“智能⼩车”就能找到,带上马达⼀整套,也就五六⼗块钱。
摄像头+云台:某宝上也是⼀搜⼀⼤堆,⽐如我下⾯⽤的那个,45块钱。
配件准备好了,就是给⼩车的开发板装系统,然后对⼩车进⾏编程控制。
⼩车的控制最主要有两⽅⾯的控制,⼀个是⼩车的前后左右的运动控制,⼀个是摄像头的拍摄、上下左右转运的控制。
#-*- coding:UTF-8 -*-import RPi.GPIO as GPIOimport time#⼩车电机引脚定义LeftIn1 = 20LeftIn2 = 21LeftSpeed = 16RightIn1 = 19RightIn2 = 26RightSpeed = 13#设置GPIO⼝为BCM编码⽅式GPIO.setmode(GPIO.BCM)#忽略警告信息GPIO.setwarnings(False)#电机引脚初始化操作def car_init():global pwm_LeftSpeedglobal pwm_RightSpeedglobal delaytimeGPIO.setup(LeftSpeed,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(LeftIn1,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(LeftIn2,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(RightSpeed,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(RightIn1,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(RightIn2,GPIO.OUT,initial=GPIO.LOW)#设置pwm引脚和频率为2000hzpwm_LeftSpeed = GPIO.PWM(LeftSpeed, 2000)pwm_RightSpeed = GPIO.PWM(RightSpeed, 2000)pwm_LeftSpeed.start(0)pwm_RightSpeed.start(0)#⼩车前进def run(delaytime):GPIO.output(LeftIn1, GPIO.HIGH)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.HIGH)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#⼩车后退def back(delaytime):GPIO.output(LeftIn1, GPIO.LOW)GPIO.output(LeftIn2, GPIO.HIGH)GPIO.output(RightIn1, GPIO.LOW)GPIO.output(RightIn2, GPIO.HIGH)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#⼩车左转def left(delaytime):GPIO.output(LeftIn1, GPIO.LOW)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.HIGH)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#⼩车右转def right(delaytime):GPIO.output(LeftIn1, GPIO.HIGH)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.LOW)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#⼩车原地左转def spin_left(delaytime):GPIO.output(LeftIn1, GPIO.LOW)GPIO.output(LeftIn2, GPIO.HIGH)GPIO.output(RightIn1, GPIO.HIGH)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#⼩车原地右转def spin_right(delaytime):GPIO.output(LeftIn1, GPIO.HIGH)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.LOW)GPIO.output(RightIn2, GPIO.HIGH)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#⼩车停⽌def brake(delaytime):GPIO.output(LeftIn1, GPIO.LOW)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.LOW)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)摄像头控制有两部分,⼀是拍摄、⼆是云台转动。
树莓派机器小车联动控制程序
gpio.output(13,False)
time.sleep(timerun)
gpio.cleanup() #演示timerum秒转动停止转动
def youzhuan(timerun): #左轮前进,右轮不动,为右转
gpio.setwarnings(False) #去掉一些不必要的警告
zuoqian = 7 #7脚为控制左侧轮前进,11脚控制左侧轮子后退
zuohou = 11
youqian = 15 #15脚为控制右侧轮前进,13脚控制右侧轮子后退
init()
gpio.output(7,True) #左侧轮子前进
gpio.output(11,False)
gpio.output(15,False) #右侧轮子后退
gpio.output(13,True)
time.sleep(timerun)
gpio.output(15,True) #右侧轮子前进
gpio.output(13,False)
time.sleep(timerun)
gpio.cleanup() #演示timerum秒转动停止转动
def houtui(timerun): #左右都往后,为前后
init()
gpio.output(7,True) #左侧轮子前进
gpio.output(11,False)
gpio.output(15,False) #右侧轮子不动
gpio.output(13,False)
time.sleep(timerun)
youhou = 13
def init():
智能避障小车原理图及源程序,诺基亚显示屏显示信息
智能小车原理图及源程序智能小车避障、圣光报警程序/*用T0计时器中断进行对小车方向的调节用INT0外部中断进行声光报警用INT1外部中断进行超声避障用T1计时器进行对时间的测量*/#include<reg52.h>#include<stdio.h>sbit P00=P1^0; //循迹口sbit P01=P1^1;sbit P02=P1^2;sbit P03=P0^3; //声光信号P03接蜂鸣器,P04接LED sbit P04=P0^4;sbit P20=P2^0; //电机1 左轮sbit P21=P2^1;sbit P22=P2^2; //电机2sbit P23=P2^3;void zhuanxiang(char,char,char);void delay1ms(void);void delaynms(int);unsigned int i=0,j=0; //特殊情况旗标void kongzhi(void) interrupt 1 //PWM信号进行电机控制{if(P00==0&&P01==1&&P02==0) //小车直线快走定时0.02ms{TH0=0X1F;TL0=0XEC;P20=0; //电机1 左轮P21=1;P22=1; //电机2 右转P23=0;}if(P00==0&&P01==0&&P02==1) //小车右转定时0.05ms {TH0=0X1F;TL0=0XCE;P20=1; //电机1 左轮P21=1;P22=1; //电机2P23=0;i=1;}if(P00==0&&P01==0&&P02==0&&i==1) // 特别{TH0=0X1F;TL0=0XCE;P20=1;P21=1;P22=1;P23=0;j=0;}if(P00==1&&P01==0&&P02==0) //小车左转定时0.05ms {TH0=0X1F;TL0=0XCE;P20=0; //电机1P21=1;P22=1; //电机2P23=1;j=1;}if(P00==0&&P01==0&&P02==0&&j==1) // 特别{TH0=0X1F;TL0=0XCE;P20=0;P21=1;P22=1;P23=1;i=0;}if(P00==1&&P01==1&&P02==1){ //全部检测到黑线时车停TH0=0X1F;TL0=0XCE;P20=1;P21=1;P22=1;P23=1;}}void shengguang(void) interrupt 0 //停车并产生声光2s{unsigned int i,j;P20=1;P21=1;P22=1;P23=1;delaynms(500);for(i=0;i<20;i++){P04=0;for(j=0;j<100;j++){P03=0;delay1ms();P03=~P03;}}P03=1; //关闭声光P04=1;delaynms(500);P20=0;//继续行车P21=1;P22=1;P23=0;}void chaoshengbo(void) interrupt 2 //超声波测距避障程序{}void main(){while(1){P20=1;P21=1;P22=1;P23=1;//小车停P03=1;P04=1;PX0=1;TMOD=0X10;//T0用方式0,T1用方式1EA=1; //开启中断总开关EX0=1;//T0中断EX1=1; //T1中断ET0=1;//INT0中断ET1=1; //INT1中断TR1=1; //开启T1计时器zhuanxiang(P00,P01,P02);}}void zhuanxiang(char P00,char P01,char P02){if(P00==0&&P01==1&&P02==0) // 小车直走{ //0.01msTH0=0X1F;TL0=0XF6;;TR0=1;}if(P00==0&&P01==0&&P02==1) //小车右转定时0.05ms{TH0=0X1F;TL0=0XCE;TR0=1;}if(P00==1&&P01==0&&P02==0) //小车左转定时0.05ms {TH0=0X1F;TL0=0XCE;TR0=1;}if(P00==1&&P01==1&&P02==1) //全部检测到黑线时车停{TH0=0X1F;TL0=0XCE;TR0=1;}}void delay1ms(void){int i;for(i=0;i<120;i++);}void delaynms(int n){int i,j;for(i=0;i<n;i++)for(j=0;j<120;j++);}诺基亚显示程序:#include <reg51.h>#include <stdio.h>#include<string.h>sbit SCLK = P1^5; // pin 2 header 5sbit SDIN = P1^4; // pin 3 header 4sbit LCD_DC = P1^3; // pin 4 header 3sbit LCD_CE = P1^2; // pin 5 header 2sbit LCD_RST = P1^1; // pin 9 header 1void LCD_init(void);void LCD_clear(void);void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);void LCD_write_char(unsigned char c);void LCD_write_byte(unsigned char dat, unsigned char dc);void LCD_set_XY(unsigned char X, unsigned char Y);void delay_1us(void);unsigned char font6x8[5][4]={{'a','s','d','f'},{'j','k','f','e'},{'j','y','i','o'},{'t','f','j','g'},{'d','s',' ','g'}}; unsigned char write_chinese[3][1]={{'1'},{'g'},{'h'}};void main(void){LCD_init(); //初始化液晶LCD_clear();while(1){LCD_init();//设置基本功能LCD_clear();//清屏LCD_set_XY(0,0);//设置坐标X:0-83,Y:0-5LCD_write_chinese_string(12,4,12,4,0,5);//写入汉字}}void LCD_init(void){// 产生一个让LCD复位的低电平脉冲LCD_RST = 0;delay_1us();LCD_RST = 1;// 关闭LCDLCD_CE = 0;delay_1us();// 使能LCDLCD_CE = 1;delay_1us();LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式LCD_write_byte(0xc8, 0); // 设置偏置电压LCD_write_byte(0x06, 0); // 温度校正LCD_write_byte(0x13, 0); // 1:48LCD_write_byte(0x20, 0); // 使用基本命令LCD_clear(); // 清屏LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示// 关闭LCDLCD_CE = 0;}void LCD_clear(void) //LCD_clear : LCD清屏函数{unsigned int i;LCD_write_byte(0x0c, 0);LCD_write_byte(0x80, 0);for (i=0; i<504; i++)LCD_write_byte(0, 1);}/* LCD_set_XY : 设置LCD坐标函数输入参数:X :0-83Y :0-5*/void LCD_set_XY(unsigned char X, unsigned char Y){LCD_write_byte(0x40 | Y, 0); // columnLCD_write_byte(0x80 | X, 0); // row}/*-----------------------------------------------------------------------LCD_write_char : 显示英文字符输入参数:c :显示的字符;*/void LCD_write_char(unsigned char c){unsigned char line;c -= 32;for (line=0; line<6; line++)LCD_write_byte(font6x8[c][line], 1);}/*----------------------------------------LCD_write_chinese_string: 在LCD上显示汉字输入参数:X、Y :显示汉字的起始X、Y坐标;ch_with :汉字点阵的宽度num :显示汉字的个数;line :汉字点阵数组中的起始行数row :汉字显示的行间距例如:LCD_write_chi(0,0,12,7,0,0);-------------------------------------------*/void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row){unsigned char i,n;LCD_set_XY(X,Y); //设置初始位置for (i=0;i<num;){for (n=0; n<ch_with*2; n++) //写一个汉字{if (n==ch_with) //写汉字的下半部分{if (i==0) LCD_set_XY(X,Y+1);elseLCD_set_XY((X+(ch_with+row)*i),Y+1);}LCD_write_byte(write_chinese[line+i][n],1);}i++;LCD_set_XY((X+(ch_with+row)*i),Y);}}/*-----------------------------------------------------------------------LCD_write_byte : 使用SPI接口写数据到LCD输入参数:data :写入的数据;command :写数据/命令选择;-----------------------------------------------------------------------*/void LCD_write_byte(unsigned char dat, unsigned char command) {unsigned char i;//PORTB &= ~LCD_CE ; // 使能LCDLCD_CE = 0;if (command == 0)// PORTB &= ~LCD_DC ; // 传送命令LCD_DC = 0;else// PORTB |= LCD_DC ; // 传送数据LCD_DC = 1;for(i=0;i<8;i++){if(dat&0x80)SDIN = 1;elseSDIN = 0;SCLK = 0;dat = dat << 1;SCLK = 1;}// SPDR = data; // 传送数据到SPI寄存器//while ((SPSR & 0x80) == 0); // 等待数据传送完毕//PORTB |= LCD_CE ; // 关闭LCDLCD_CE = 1;}。
基于树莓派的智能预警避障小车设计
电机部分使用的是直流电机,通过单片机输出的信号来控制电机的正反转, 从而实现小车的前进、后退和转向。
2、软件设计
软件部分主要是实现避障算法和控制逻辑。避障算法可以采用多种方式,如 基于模糊逻辑的避障算法、基于神经网络的避障算法等。控制逻辑则是根据避障 算法输出的结果来控制电机的运动。
三、实验结果与分析
在实验中,我们使用基于模糊逻辑的避障算法进行测试。实验结果表明,智 能避障小车能够有效地避开前方的障碍物,并根据障碍物的位置和距离调整自身 的运动方向和速度,实现了预期的避障效果。
四、结论
本次演示设计的基于单片机的智能避障小车,通过硬件和软件的配合,实现 了对前方障碍物的检测和避让。实验结果表明该设计方案是可行的,具有实际应 用价值。未来的研究方向可以是对避障算法的进一步优化,提高避障小车的反应 速度和准确度,也可以考虑加入更多的传感器和控制策略,实现更复杂的避障行 为。
五、
感谢观看
设计思路和流程
基于树莓派的智能预警避障小车的设计思路是以树莓派为核心控制器,通过 GPIO接口连接各类传感器和执行器,从而实现对小车的智能控制。具体设计流程 如下:
1、确定控制系统:选用树莓派作为控制核心,因为它具有丰富的GPIO接口, 可以连接多种传感器和执行器。
2、确定传感器和执行器:选择红外线传感器、超声波传感器、摄像头等传 感器来获取环境信息;选择电机、舵机等执行器来控制小车的运动。
基于树莓派的智能预警避障小 车设计
目录
01 智能预警避障小车的 应用背景和意义
03 参考内容
02 设计思路和流程
随着科技的不断发展,智能车辆已经成为现代社会的一个重要组成部分。在 这种背景下,基于树莓派的智能预警避障小车应运而生。本次演示将介绍一种基 于树莓派的智能预警避障小车的设计方案,包括硬件和软件部分,并最后通过实 验验证其可行性和有效性。
智能小车循迹避障红外遥控C语言代码
.//智能小车避障、循迹、红外遥控C语言代码//实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹,1602显示小车的工作状态,另有三个独立按键分别控制三种状态的转换//注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <reg52.h>#include <math.h>#includelcd.h#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar ENCHAR_PuZh1[8]= run ;//1602显示数组uchar ENCHAR_PuZh2[8]= back ;uchar ENCHAR_PuZh3[8]= stop ;uchar ENCHAR_PuZh4[8]= left ;uchar ENCHAR_PuZh5[8]= right ;uchar ENCHAR_PuZh6[8]= xunji ;uchar ENCHAR_PuZh7[8]= bizhang;uchar ENCHAR_PuZh8[8]= yaokong;#define HW P2 //红外传感器引脚配置P2k口#define PWM P1 /* L298N管脚定义*//******************************超声波引脚控制******************************/sbit ECHO=P3^2; //超声波接收引脚定义兼红外遥控按键state_total =2sbit TRIG=P3^3; //超声波发送引脚定义/////红外控制引脚配置sbit KEY2=P3^7; //红外接收器数据线兼循迹按键state_total= 0sbit KEY1=P3^4; //独立按键p3.4控制自动避障state_total=1uchar state_total=3,state_2=0;//总状态控制全局变量0为自动循迹模块1为自动避障模块2为红外遥控uchar state_1,DAT; //红外扫描标志位uchar time_1=0,time_2=0;//定时器1中断全局变量time_ 2控制PWM脉冲计数time_1控制转弯延时计数也做延时一次0.005suchar time,timeH,timeL,state=0;//超声波测量缓冲变量state为超声波状态检测控制全局变量uint count=0; //1602显示计数/**************************/unsigned char IRCOM[7]; //红外接收头接收数据缓存IRCOM[2]存放的为数据unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; //红外接收缓存变量/***********/void IRdelay(char x); //x*0.14MS 红外头专用delayvoid run();void back();'..void stop();void left_90();void left_180();void right_90();void delay(uint dat); //void init_test();void delay_100ms(uint ms) ;void display(uchar temp); //超声波显示驱动void bizhang_test();void xunji_test();void hongwai_test();void Delay10ms(void);void init_test()//定时器0 1 外部中断0 1 延时初始化{TMOD=0x11; //设置定时器0 1 工作方式1 16位初值定时器TH1=0Xfe; //装入初值定时一次为0.0005s 2000hzTL1=0x0c;TF0=0; //定时器0方式1计数溢出标志TF1=0; //定时器1方式1计数溢出标志ET0=1; //允许定时器0中断溢出ET1=1; //允许定时器1中断溢出EA=1; //开总中断if(state_total==1)//为超声波模块时初始化{TRIG=0; //发射引脚低电平ECHO=0; // 接收引脚低电平EX0=0; //关闭外部中断IT0=1; //由高电平变低电平,触发外部中断0 }if(state_total==2) //红外遥控初始化{ IT1=1; //外部中断1为负跳变触发EX1=1; //允许外部中断1TRIG=1; // 3.3为高电平I/O口初始化}delay(60); //等待硬件操作}void main(){ uint i;delay(50);init_test();TR1=1; //开启定时器1LCD1602_Init() ;delay(50);while(state_2==0)'..{if(KEY1==0) //检测按键s1是否按下{Delay10ms(); //消除抖动if(KEY1==0){state_total=0; //总状态定义0为自动循迹模块1为自动避障模块2为红外遥控while((i<30)&&(KEY1==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}if(TRIG==0) //检测按键s2是否按下{Delay10ms(); //消除抖动if(TRIG==0){state_total=1; //总状态定义0为自动循迹模块为自动避 1 2为红外遥控障模块while((i<30)&&(TRIG==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}s3是否按下if(KEY2==0) //检测按键{消除抖动Delay10ms(); //if(KEY2==0){1 总状态定义// 0为自动循迹模块为自动避state_total=2;2 为红外遥控障模块检测按键是否松开while((i<30)&&(KEY2==0)) //{Delay10ms();i++;}i=0;'..}}}init_test();delay(50); //等待硬件操作50usTR1=0; //关闭定时器1if(state_total==1){//SPEED=90; //自动循迹速度控制高电平持续次数占空比为10的低电平bizhang_test();}if(state_total==0){// SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平xunji_test();}if(state_total==2){//SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平hongwai_test();}}void init0_suspend(void) interrupt 0 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{timeH=TH0; //记录高电平次数timeL=TL0; //state=1; //标志状态为1,表示已接收到返回信号EX0=0; //关闭外部中断0}void time0_suspend0(void) interrupt 1 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{if(state_total==1) // 自动避障初值装入{ TH0=0X00; //装入初值TL0=0x00;}if(state_total==0) //自动循迹初值装入{ TH0=0Xec; //装入初值定时一次0.005s 200hzTL0=0x78;time_1++; //控制转弯延时计数'..}}void IR_IN(void) interrupt 2{unsigned char j,k,N=0;EX1 = 0;IRdelay(5);if (TRIG==1){ EX1 =1;return;}//确认IR信号出现while (!TRIG) //等IR变为高电平,跳过9ms的前导低电平信号。
寻迹避障小车51程序(绝版模块化程序)
M a i n.c #include "common.h"#include "motor.h"#include "timer.h"uchar speed_l;uchar speed_r;sbit out = P3^7;void main(){P1 = 0xff;flag_l = 0;flag_r = 0;sensor_ldata = 0;sensor_rdata = 0;avoid_keyfunc = 0;findline_keyfunc = 0;motor_stop();timerinit();while(1){/*********************************************************循迹功能*********************************************************/while(findline_keyfunc){/**************************************************************** 正常情况下前进****************************************************************/ if(sensor == 0x27){motor_go();speed_l = 50;speed_r = 47;}/****************************************************************如果小车偏左****************************************************************/if((sensor == 0x37) || (sensor == 0x17) || (sensor == 0x0f) || (sensor == 0x1f) || (sensor == 0x3f)){motor_r();speed_l = 45;speed_r--;if(speed_r == 30){speed_r = 31;}}/**************************************************************** 如果小车偏右****************************************************************/if((sensor == 0x67) || (sensor == 0x47) || (sensor == 0x87) || (sensor == 0xc7) ||(sensor == 0xe7)){motor_l();speed_r = 45;speed_l--;if(speed_l == 30){speed_l = 31;}}}/////////////////////////////////////////////////////////////////// /////****************************************************************** * 避障功能******************************************************************* / while(avoid_keyfunc){/*********************************************************** 如果没有检测到有障碍物***********************************************************/ if((sensor_ldata == 1) && (sensor_rdata == 1)){motor_go();speed_l = 48;speed_r = 50;}/*********************************************************** 如果检测到右边有障碍物***********************************************************/ if((sensor_ldata == 1) && (sensor_rdata == 0)){motor_go();speed_l--;speed_r = 100;if(speed_l == 10){speed_l = 11;}}/****************************************************** 如果左边检测到有障碍物******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 1)){motor_go();speed_r--;speed_l = 100;if(speed_r == 10){speed_r = 11;}}/****************************************************** 如果都检测到有障碍物******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 0)){motor_go();speed_r = 100;speed_l = 10;}//////////////////////////////////////}/////////////////////////////////////motor_stop();}}MAIN.H#ifndef MAIN_H#define MAIN_Hextern uchar speed_l;extern uchar speed_r;#endifMotor.c#include "common.h"#include "timer.h"sbit in1 = P2^0;sbit in2 = P2^1; //左电机sbit in3 = P2^2;sbit in4 = P2^3;//右电机sbit ENA = P2^4; //只有当ENA=1时左电机才能转sbit ENB = P2^5; // 只有。
【树莓派】树莓派小车(三)Python控制小车
【树莓派】树莓派⼩车(三)Python控制⼩车正⽂之前由于最近忙于复习赶考,所以暂时没有拿起树莓派⼩车,直到昨天,终于空出时间来把代码整理⼀下来和⼤家分享。
正⽂在中,讲到了树莓派的引脚定义⽅式有两种:PHYSICAL NUMBERINGGPIO NUMBERING我采⽤的是第⼆种⽅式。
开始写1. 导⼊库import RPi.GPIO as GPIOimport time2. 定义接⼝⽅式以及接⼝位置GPIO.setmode(GPIO.BCM)IN1 = 17IN2 = 18IN3 = 27IN4 = 22IN5 = 23IN6 = 24IN1 - IN4为L298N接⼊,IN5和IN6为红外线模块接⼊。
车轮驱动⽅式:IN1和IN2负责驱动车轮转动(前进)。
IN3和IN4负责驱动车轮转动(后退)。
3. 初始化def init():GPIO.setup(IN1, GPIO.OUT)GPIO.setup(IN2, GPIO.OUT)GPIO.setup(IN3, GPIO.OUT)GPIO.setup(IN4, GPIO.OUT)GPIO.setup(IN5, GPIO.IN)GPIO.setup(IN6, GPIO.IN)连接L298N的接⼝设为输出,因为需要输出的信号来驱动电机。
连接红外线模块的接⼝为输⼊,因为需要输⼊的信号来做出判断。
4. 基础⽅向⾏为def up():GPIO.output(IN1, GPIO.HIGH) //右侧车轮前进GPIO.output(IN2, GPIO.HIGH) //左侧车轮前进GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.LOW)def down():GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.HIGH) //右侧车轮后退GPIO.output(IN4, GPIO.HIGH) //左侧车轮后退def turn_left():GPIO.output(IN1, GPIO.HIGH) //右侧车轮前进GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.LOW)def turn_right():GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.HIGH) //左侧车轮前进GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.LOW)需要说明的是:由于不含舵机,转弯的操作是单边车轮驱动,带动车⾝转动5. 红外控制init()n = 5while (n > 0): //总共转弯五次in_left = GPIO.input(IN5) //左侧红外线接收器in_right = GPIO.input(IN6) //右侧红外线接收器up() //未遇到障碍时直⾏if (in_left == GPIO.LOW):down()time.sleep(1)turn_right()time.sleep(1)n = n - 1continueif (in_right == GPIO.LOW):down()time.sleep(1)turn_left()time.sleep(1)n = n - 1continueif (in_right == GPIO.LOW & in_left == GPIO.LOW):down()time.sleep(1)turn_right() //如果两侧都有障碍,就右转(个⼈喜好)time.sleep(1)n = n - 1continuestop()GPIO.cleanup() //清空GPIO接⼝配置信息如果前⽅遇到障碍,就后退⼀秒,然后转弯,最后继续直⾏,直到遇到下⼀个障碍。
采用树莓派与L298N制作遥控小车全攻略
采用树莓派与L298N制作遥控小车全攻略 本文主要描述使用树莓派和L298N制作一个简单的遥控小车,遥控器使用简单的WEB来实现。
准备工作 树莓派,(本文使用的是Raspberry PI 2 B型,即2B) 8G以上TF卡树莓派上可用和不可用的SD卡列表 四驱小车底(含电机,注:本文中的小车底盘佩戴的是高扭矩直流电机) 母对母、公对母、公对公(可不用)杜邦线 L298N双HD桥电机驱动板 无线网卡(最好支持AP的) 充电电池组(7V以上的,镍氢或者18650充电电池皆可) 系统安装没什幺说的,系统烧到SD就可以了,我使用的Raspbian,这货是基于Debian的,配置命令习惯几乎和ubuntu/debian一样,接上网线开机进入系统配置。
换上中科大的源,再apt-get update一次; 为root用户设置密码; 配置无线网卡有两中方案,编辑/etc/network/interface,网上教程蛮多 自动连接到路由器,家里有无线路由器,小车在WIFI覆盖的地方; 树莓派上搭建WIFI热点,信号更好,可以在小区里面开,顺便勾搭妹子,哦哦哦,不对,应该是淘气小孩。
唯一需要注意的是网卡芯片。
底盘组装 拼装没啥难度,亚克力板上的牛皮纸沾得简直是丧心病狂,马蛋,废了好一会儿功夫才撕干净(⊙﹏⊙)b; 马达那货就比较坑了,没有带线是裸机的,手中也恰巧没有电烙铁,当时我就懵逼啦。
好吧,手中还有多余的公对公杜邦线,拔掉其中一头的接头,打火机烧一下(小时候学会的神技),拔掉一部分把铜线拧紧。
最后铜线穿过马达接口的小洞里面,再拧紧。
哎丫,没有胶带,最后用透明胶凑合凑合,绑紧。
repeat 4次。
线路连接 +12V接口 +5V~+35V,如需要板内取电,则供电范围Vs:+7V~+35V 电机 OUT1、OUT2 为电机A输出;OUT3、OUT4为电机B输出 IO接口 ENA和ENA分别为A、B电机的使能端,一开始ENA和ENB各自的上下两个针脚是用跳线帽连接起来的,拔掉就可以接线了。
树莓派wifi智能小车基本原理
出厂首次测试 前言 智能小车设计原理 智能小车分模块设计
出厂首次测试
出厂首次测试
蓝牙控制小车
第一步:打开下载好的“亚博智能4WD”app软件,然后打开 我们手机的蓝牙,进入到蓝牙配对界面
第二步:配对成功之后自动进入小车操作界面,接下来, 我们就可以操作小车了。
智能小车设计原理
智能小车设计原理
树莓派wifi智能小车是利用PC或者手机作为控制端,通过手机 连接树莓派路由器以获取wifi信号,树莓派的底板通过排线与树 莓派主控板连接起来,树莓派的底板上就连接相应的外设。从 而实现手机和小车的无线连接。我们通过手机上的android软件
以wifi作为信息载体。通过socket套经接字济的性TCP协议进行通信,将 指来令的发指系送令统给,树并莓设派置路相由应器的G,P树IO莓口派,通以EC过实ON解现OMY析相. 相应关的的避手障机,发跟送随过,
树莓派智能小车原理框图
智能小车设计原理
模块简介
七彩灯模块 电机模块 超声波模块 红外避障寻光模块 四路寻迹模块
七彩灯模块
七彩灯模块
七彩探照灯模块
七彩灯模块
电机模块
电机模块
电机模块
超声波模块
超声波模块
超声波模块是利用超声波的
特性检测距离的传感器,其 带有两个超声波探头,分别 作为发射和接收超声波。其 测量的范围是0-500cm。
即可计算出实际的距离:距离=高电平时间*声速(340M/S)/2
红外避障寻光模块
红外避障寻光模块
目标管理 八大过程
企业经营战略为首,没有 战略就没有发展。目标管 理首要的是目标的制定, 而这个目标必须围绕战略 需要进行科学设定。从战 略到目标是一个从意图到 明确的过程,没有这个过 程,战略只能是一种意图 、只能是一种打算,在一 定程度上没有目标支撑的 战略也只能是设想。
Arduino智能避障小车避障程序
Arduino智能避障小车避障程序首先建立一个名为modulecar.ino的主程序。
// modulecar.ino,玩转智能小车主程序#include <Servo.h> //导入舵机库#include <NewPing.h> //导入NwePing库// 对照系统配线方案依次指定各I/Oconst int ENA = 3 ; //左电机PWMconst int IN1 = 4 ; //左电机正const int IN2 = 5 ; //左电机负const int ENB = 6 ; //右电机PWMconst int IN3 = 7 ; //右电机正const int IN4 = 8 ; //右电机负const int trigger = 9 ; //定义超声波传感器发射脚为D9 const int echo = 10 ; //定义传感器接收脚为D10 const int max_read = 300; //设定传感器最大探测距离。
int no_good = 35; //*设定35cm警戒距离。
int read_ahead; //实际距离读数。
Servo sensorStation; //设定传感器平台。
NewPing sensor(trigger, echo, max_read); //设定传感器引脚和最大读数//系统初始化void setup(){Serial.begin(9600); //启用串行监视器可以给调试带来极大便利sensorStation.attach(11); //把D11分配给舵机pinMode(ENA, OUTPUT); //依次设定各I/O属性pinMode(IN1, OUTPUT);pinMode(IN2, OUTPUT);pinMode(ENB, OUTPUT);pinMode(IN3, OUTPUT);pinMode(IN4, OUTPUT);pinMode(trigger, OUTPUT);pinMode(echo, INPUT);sensorStation.write(90); //舵机复位至90?delay(6000); //上电等待6s后进入主循环}//主程序void loop(){read_ahead = readDistance(); //调用readDistance()函数读出前方距离Serial.println("AHEAD:");Serial.println(read_ahead); //串行监视器显示机器人前方距离if (read_ahead < no_good) //如果前方距离小于警戒值{fastStop(); //就令机器人紧急刹车waTch(); //然后左右查看,分析得出最佳路线goForward(); //*此处调用看似多余,但可以确保机器人高速运转下动作的连贯性}else goForward(); //否则就一直向前行驶}主程序用到了两个库,Servo库是IDE自带的,NwePing库是第三方库,需要下载安装。
智能寻迹避障小车寻线、避障控制程序设计
1.1.2 寻迹电路原理
小车处于白色区域,这时小车就会沿直线行走 ,当红外发射管左边对准黑线(黑胶带),右 边对准白线(白色地面)时,左边的红外线被 黑线吸收,红外线无法反射回,则左边呈现高 电平,即单片机检测到P3.5=1(左边)、 P3.6=0,这时,小车便向左边修正(左转弯 ),使左边传感器重新回到白色区域。右转弯 过程与左转弯相类似,请学员自行分析。
//左边往前
//右边往前
湖南创博龙智信息 科技有限公司
2.1.4 参考程序代码
void hou() { zuo1=1; zuo2=0; you1=1; you2=0; } void zuo() { zuo1=1; zuo2=0; you1=0; you2=1; } void you() { zuo1=0; zuo2=1; you1=1; you2=0; } //左边往后 //右边往后
智能寻迹小车设计与制作 (寻线、避障控制程序设计)
主讲:雷道仲
湖南创博龙智信息 科技有限公司
任务及要求
任务一:智能寻迹避障小车寻线程序设计 固定路线寻线:学员编写程序使智能
寻线、避障控制模块共设置了两个任务,分别如下:
寻迹避障小车沿黑色圆圈行走,行走过程
中小车一直压着黑线走,不得冲出黑线圆
圈之外或之内。
湖南创博龙智信息 科技有限公司
1.1.4 程序代码
void you() { zuo1=0; zuo2=1; you1=1; you2=0; } void main() { while(1) { if(zuod==0&youd==0) { qian(); out=ZM[1]; } if(zuod==1&youd==0) { while(1) { zuo(); out=ZM[3]; D1=0; if(zuod==0)
微信小程序实现树莓派(raspberrypi)小车控制
微信⼩程序实现树莓派(raspberrypi)⼩车控制本⽂是基于上⼀篇“⽹页版树莓派⼩车控制程序”改造⽽成。
主要也练习了⼀下微信⼩程序的开发。
这⾥简单记录⼀下主要代码⽚段。
也是趟过了许多的坑,例如:微信⼩程序不⽀持完全全屏,微信⼩程序不能横屏展⽰。
所以开发过程中也⽤了⼀些⾮常⼿段。
可以说这只是⼀个很基本的demo,所以⾥⾯很多东西,⽐如摄像头监控ip、页⾯元素定位我都使⽤了写死的值。
特别是界⾯,我只是在iPhone 6上⾯做的实验,所以换到其他⼿机上时,界⾯就会变型了。
1. 基本思路进⼊⼩程序时展⽰index页,可以让⽤户输⼊服务端url(模拟上⼀篇中在浏览器获取get请求)然后跳转到实际的⼩车控制界⾯,并可以通过点击按钮实现⼩车控制控制⼩车的移动,主要是在control.js中定义了界⾯按钮事件的响应,在响应事件的过程中实现http请求的发送index页⾯如下:进去之后的页⾯如下(其中中间空⽩处会展⽰摄像头监控,不过我并没有启动,所以看不见):2. 代码结构如下:其中,index下⾯是⾸页,control是控制页⾯,res⽬录下存放的是图⽚资源3. index⽬录index.js//index.js//获取应⽤实例const app = getApp()Page({data: {logo: "/res/rasp-logo.png",welcome: "欢迎使⽤树莓⼩车",enterBtn: "进⼊",PromoteMsg: "Please enter the server address (eg: http://x.x.x.x:8080)",reqURL: ""},// 从输⼊框中获取⽤户输⼊的服务器地址信息getURL: function (e) {this.setData({reqURL: e.detail.value})},enterClicked: function (e) {/** 当按下进⼊按钮,需要做以下事情:* 1. ⾸先判断⽤户是否已经在输⼊框中输⼊完整的服务器地址* 2. 发起⼀个到服务器的GET请求,并分析服务器的响应结果* 3. 跳转到⼩车控制界⾯*/console.log(this.data.reqURL)if (this.data.reqURL == '') {wx.showModal({title: '提⽰',content: '请先输⼊正确的服务器地址!',})return}// 发起到服务器的GET请求wx.request({url: this.data.reqURL,success: function (res) {// 在这⾥获取POST请求地址,以及视频流地址,然后赋值给全局变量,供control页⾯调⽤ console.log(res.data.match(/url = \"(\S*)\"/)[1])console.log(res.data.match(/src=\"(\S*)\"/)[1])app.globalData.postURL = res.data.match(/url = \"(\S*)\"/)[1]app.globalData.cameraURL = res.data.match(/src=\"(\S*)\"/)[1]// 跳转到control页⾯wx.navigateTo({url: '/pages/control/control',})},fail: function(res) {wx.showModal({title: '提⽰',content: '请检查输⼊的服务器地址!',})}})}})index.json:⽆数据,只有⼀对打括号index.wxml<!--index.wxml--><view><view class="welcome"><view class="logo"><image style="width: 250rpx; height: 250rpx" src="{{logo}}"></image></view><view><text class="words">{{welcome}}</text></view></view><input class="requestURL" type="text" placeholder="{{PromoteMsg}}" focus='1' cursor='10' confirm-type="done" bindinput='getURL'></input> <button class='enter' bindtap='enterClicked'>{{enterBtn}}</button></view>index.wxss/**index.wxss**/.welcome{display: flex;margin-top: 50rpx;flex-direction: column;align-items: center;justify-content: space-between;}.requestURL{margin: 50rpx 10rpx 30rpx 10rpx;border: 1px solid gray;font-style: italic;font-size: small}.enter{margin-right: 10rpx;width: 150rpx;height: 60rpx;font-size: small}4. control⽬录control.js// pages/control/control.jsconst app = getApp()Page({/*** 页⾯的初始数据*/data: {// Car control images"forwardBtn": "/res/forward.png","leftBtn": "/res/left.png","rightBtn": "/res/right.png","backLeftBtn": "/res/back-left.png","backRightBtn": "/res/back-right.png","backBtn": "/res/backward.png",// Camera control images"upBtn": "/res/forward.png","camLeftBtn": "/res/camLeft.png","camRightBtn": "/res/camRight.png","downBtn": "/res/backward.png","resetBtn": "/res/reset.png"},carMove: function(event) {wx.request({url: this.data.postURL,data: event.currentTarget.dataset.direction,method: "POST",success: function(res){},fail: function(res){}})},carStop: function(event) {wx.request({url: this.data.postURL,data: "S",method: "POST",success: function (res) {},fail: function (res) {}})},camMove: function(event) {wx.request({url: this.data.postURL,data: event.currentTarget.dataset.direction,method: "POST",success: function (res) {},fail: function (res) {}})},/*** ⽣命周期函数--监听页⾯加载*/onLoad: function (options) {//this.data.cameraURL = app.globalData.cameraURLthis.setData({cameraURL: app.globalData.cameraURL,postURL: app.globalData.postURL})console.log(this.data.cameraURL)console.log("post url in control page: " + app.globalData.postURL) },/*** ⽣命周期函数--监听页⾯初次渲染完成*/onReady: function () {},/*** ⽣命周期函数--监听页⾯显⽰*/onShow: function () {//console.log(wx.getSystemInfoSync().windowWidth)//console.log(wx.getSystemInfoSync().windowHeight)},/*** ⽣命周期函数--监听页⾯隐藏*/onHide: function () {},/*** ⽣命周期函数--监听页⾯卸载*/onUnload: function () {},/*** 页⾯相关事件处理函数--监听⽤户下拉动作*/onPullDownRefresh: function () {},/*** 页⾯上拉触底事件的处理函数onReachBottom: function () {},/*** ⽤户点击右上⾓分享*/onShareAppMessage: function () {}})control.json{"navigationBarBackgroundColor": "#ffffff","navigationBarTextStyle": "black","navigationBarTitleText": "树莓⼩车","backgroundColor": "#eeeeee","backgroundTextStyle": "light","enablePullDownRefresh": false,"navigationStyle": "custom","disableScroll": true}control.wxml<!--pages/control/control.wxml--><view class='control'><!-- This image shows the camera view --><image class='cameraView' src='http://192.168.1.104:8080/?action=stream' style="z-index:1"></image><!-- The following six images control the car move --><image class='button' id='forward' src='{{forwardBtn}}' style="position:absolute;z-index:2" bindtouchstart='carMove' data-direction='F' bindtouchend='carStop'></image><image class='button' id='left' src='{{leftBtn}}' style="position:absolute;z-index:2" bindtouchstart='carMove' data-direction='L' bindtouchend='carStop'></image><image class='button' id='right' src='{{rightBtn}}' style="position:absolute;z-index:2" bindtouchstart='carMove' data-direction='R' bindtouchend='carStop'></image><image class='button' id='backLeft' src='{{backLeftBtn}}' style="position:absolute;z-index:2" bindtouchstart='carMove' data-direction='BL' bindtouchend='carStop'></image> <image class='button' id='backRight' src='{{backRightBtn}}' style="position:absolute;z-index:2" bindtouchstart='carMove' data-direction='BR' bindtouchend='carStop'></image> <image class='button' id='back' src='{{backBtn}}' style="position:absolute;z-index:2" bindtouchstart='carMove' data-direction='B' bindtouchend='carStop'></image><!-- The following images control the camera move --><image class='button' id='up' src='{{upBtn}}' style="position:absolute;z-index:2" bindtouchstart='camMove' data-direction='VU'></image><image class='button' id='camLeft' src='{{camLeftBtn}}' style="position:absolute;z-index:2" bindtouchstart='camMove' data-direction='HL'></image><image class='button' id='camRight' src='{{camRightBtn}}' style="position:absolute;z-index:2" bindtouchstart='camMove' data-direction='HR'></image><image class='button' id='down' src='{{downBtn}}' style="position:absolute;z-index:2" bindtouchstart='camMove' data-direction='VD'></image><image class='button' id='reset' src='{{resetBtn}}' style="position:absolute;z-index:2" bindtouchstart='camMove' data-direction='RESET'></image></view>control.wxss/* pages/control/control.wxss */.control {width: 100%;height: 100%;transform: rotate(90deg);background-color: #eee;justify-content: center;}.cameraView {margin-left: 0px;width: 603px;height: 375px;background-color: #eee;justify-content: center;}.button {height: 60px;width: 60px;opacity: 0.3;}#forward {left: 60px;top: 135px;}#left {left: 0px;top: 195px;}#right {left: 120px;top: 195px;}#backLeft {left: 0px;top: 255px;}#backRight {left: 120px;top: 255px;}#back {left: 60px;top: 315px;}#up {left: 480px;top: 195px;}#camLeft {left: 420px;top: 255px;}#camRight {left: 540px;top: 255px;}#down {left: 480px;top: 315px;}#reset{left: 480px;top: 135px}5. ⼯程全局控制app.js:实际似乎并没有⽤到,⾥⾯都是⼯程创建时的默认代码//app.jsApp({onLaunch: function () {// 展⽰本地存储能⼒var logs = wx.getStorageSync('logs') || []logs.unshift(Date.now())wx.setStorageSync('logs', logs)// 登录wx.login({success: res => {// 发送 res.code 到后台换取 openId, sessionKey, unionId}})// 获取⽤户信息wx.getSetting({success: res => {if (res.authSetting['erInfo']) {// 已经授权,可以直接调⽤ getUserInfo 获取头像昵称,不会弹框wx.getUserInfo({success: res => {// 可以将 res 发送给后台解码出 unionIderInfo = erInfo// 由于 getUserInfo 是⽹络请求,可能会在 Page.onLoad 之后才返回// 所以此处加⼊ callback 以防⽌这种情况if (erInfoReadyCallback) {erInfoReadyCallback(res)}}})}}})},globalData: {userInfo: null,postURL: null,cameraURL: null}})app.json:{"pages": ["pages/index/index","pages/control/control"],"window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": "#fff","navigationBarTitleText": "树莓⼩车","navigationBarTextStyle": "black","showStatusBar": false}}app.wxss:/**app.wxss**/.container {height: 100%;display: flex;flex-direction: column;align-items: center;justify-content: space-between;padding: 200rpx 0;box-sizing: border-box;}project.control.json:{"description": "项⽬配置⽂件。
DIY智能循迹避障小车
DIY智能循迹避障小车百分百成功DIY,跟着步骤就可以制作出属于自己的智能循迹避障小车,培养动手能力,感受科技制作的乐趣。
坚持,坚持,再坚持。
后面有源程序代码。
第一,准备好硬件:温馨提醒一下,这些看上去很多,但准备的时候花不了多少钱,放心就行,有很多以后还可以家用。
模块准备:1.51单片机 40P锁紧座小型系统板1个(带四组外接电源接其他模块用)。
2.STC89C52R单片机1个。
3.L9110S四路驱动直流电机驱动板1个。
4.DC3V-6V直流减速电机加轮胎一套的4套。
5.HY-SRF05五针超声波模块1个。
6.循迹模块2个。
7.四节电池盒1个,三节电池盒1个。
8.南孚5号电池7节。
9.CH340下载器模块1个。
车体及其他材料准备:10.双母头杜邦线一排(40根)。
11.1米长2×2cm木条1根。
12.尼龙扎带(越长越好)至少8根(买一袋最好,以后还用得到),用来固定减速电机。
13. 5.5*2.1MM DC电源线1根。
14.循迹黑胶带1卷(也可在家中找找黑色的布条)。
15.木锯1个。
16.白乳胶1小瓶,用来粘木条。
17.小木板或硬纸板1张。
18.小螺丝刀1个。
19.小刀1个。
20.绝缘胶带1卷。
21.2mm小木棒一捆。
22.(选买)有条件的可以准备热熔胶枪加胶棒,用来将减速电机粘到木条上,结合扎带使用更加结实。
第二,开始制作:1、制作车体:将木条锯成9cm长,5cm款各两个,首先在长木条上利用尼龙扎带将电机固定,并利用白乳胶将四段粘合成车体,需要等至少12个小时才能凝固好,车体结实后装上轮胎,再将木板粘到车上。
如图:2、模块连接:电机与电机驱动模块连接图:“上”为贴近木条端模块之间连接图:用杜邦线与单片机系统板连接,P??为针名。
DC电源线连接电池盒与系统板实物图:以下为模块在小车上的摆放位置,仅供参考。
第三、下载程序(此步可第一步就操作)图中蓝线接P30,黄线接P31,绿线接地线。
玩转树莓派:树莓派智能小车DIY全过程手机控制循迹避障(包含源码)
树莓派3代B型主板 部分配件 别小看树莓派 相信出色的你能玩出更多新花样 先看一下我制作的哪些功能 红外避障 黑线循迹 手机软件控制 Scratch编程 红外跟随 下面开始进入主题 为了节省工作量呢 我从C语言版本开始说。 系统配置中文环境和拼音我就不罗嗦了 sudo apt-get install ttf-wqy-zenhei (安装中文字体库) sudo apt-get install scim-pinyin (安装中文输入法 当然了你也可以全装其他的输入法) 我建议最好用远程桌面的方式连接,以便小车运行时方便修改代码。 树莓派安装xrdp 就可以直接用笔记本自带的远程桌面工具进行远程操作了。最新的系统安 装步骤: sudo apt-get install xrdp sudo apt-get install tightvncserver 然后在windows打开远程桌面连接 打开对应的IP地址,即可连接成功 远程桌面界面
C语言安装wiringPi库 WringPI库介绍 wiringPi 安装 方案 A——使用 GIT 工具,通过 GIT 获得 wiringPi 的源代码。 git clone git:///wiringPi 测试一下是否安装成功: $gpio -v 先来搭建手机远程控制的功能,稍后再进行与传感器的结合。 简单看一下树莓派上即 服务端代码:carserver.c 几种初始化wiringPi的函数 首先在程序的开始的时候需要调用上面的任意的函数来对wiringpi 进行初始化,否则你的 程序不能正常工作。wiringPiSetup() 该函数初始化wiringPi,幵假定程序将使用wiringPi 的管脚定义图。具体管脚映射,可以通过gpio readall命令来查看。该函数需要root权限。 驱动电机使用四个引脚。1、4控制一侧,5、6另外一侧。编码方式为wPi。 引脚定义 pinMode函数 原型 void pinMode (int pin, int mode) ;使用该函数可以将某个引脚配置为INPUT(输 入)、 OUTPUT(输出) 、PWM_OUTPUT (脉冲输出) 或者GPIO_CLOCK(时钟)。在我们的 小车C语言控制程序中我们分别设置了GPIO1,GPIO4,GPIO5,GPIO6这四个引脚来控制左右 两侧的电机。此时我们是通过GPIO的输出来实现的,所以这里设置mode为OUTPUT。 digitalWrite函数
树莓派小车物体追踪
树莓派小车物体追踪:在开发树莓派智能小车的路上已经走了半年多时间了,起初做了以下简单的远程控制和避障功能,后来慢慢加入黑线循迹以及语音识别,物体识别的功能。
前段时间在刷新闻头条的时候,偶然看到一外国大牛做的树莓派目标追踪平衡车。
所以开始琢磨着让我自己的小车也加上物体追踪的功能。
在几天的资料整理之后发现是利用opencv和python实现的。
那么今天告诉大家如何安装opencv3.0和如何利用它实现我的小车避障。
之前确实安装过几次opencv都倒在了cmake编译的路上,但有问题就得解决。
翻了好几个帖子终于找到了一个靠谱的。
用了一个下午的时间终于安装成功了。
安装的教程讲已经在群文件分享给大家。
然后问题来了,opencv安装好了,怎么实现物体追踪呢。
我开始在github上找案列,找啊找啊找,输入关键字track car raspberry,找到一个,打开看看是树莓派加arduino做的。
还好arduino只是用来控制步进电机的。
我开始把树莓派gpio控制电机的部分移植到这个项目中。
在一天的调试之后,改造版的树莓派物体追踪小车出炉了。
怎么说呢,这只是个雏形,因为小车转向不够灵敏,追踪的功能需要进一步优化。
个人水平有限,希望大家一起来研究。
来说说detect.py 小车物体追踪的源码。
detect.py中物体追踪是怎么实现的呢,首先它需要捕捉一个frame边框并确定一个物体去追踪。
在确定了所要追踪的物体之后,小车将保持对物体的追踪。
源码中定义了前后左右和停止的动作。
当被锁定的物体移动时,小车则根据物体的位置作出响应即追踪物体前进。
附detect.py源码:# import the necessary packagesfrom picamera.array import PiRGBArray from picamera import PiCamera import cv2import serialimport syslogimport timeimport numpy as npimport RPi.GPIO as GPIO# define capturing sizewidth = 320height = 240tracking_width = 40tracking_height = 40auto_mode = 0def t_stop():GPIO.output(11, False)GPIO.output(12, False)GPIO.output(15, False)GPIO.output(16, False)def t_up():GPIO.output(11, True)GPIO.output(15, True)GPIO.output(16, False)time.sleep(0.05)GPIO.output(11, False)GPIO.output(12, False)GPIO.output(15, False)GPIO.output(16, False)time.sleep(0.3)def t_down():GPIO.output(11, False)GPIO.output(12, True)GPIO.output(15, False)GPIO.output(16, True)def t_left():GPIO.output(11, False)GPIO.output(12, True)GPIO.output(15, True)GPIO.output(16, False)time.sleep(0.05)GPIO.output(12, False)GPIO.output(15, False)GPIO.output(16, False)time.sleep(0.3)def t_right():GPIO.output(11, True)GPIO.output(12, False)GPIO.output(15, False)GPIO.output(16, True)time.sleep(0.05)GPIO.output(11, False)GPIO.output(12, False)GPIO.output(15, False)GPIO.output(16, False)time.sleep(0.3)def t_open():GPIO.setup(22,GPIO.OUT)GPIO.output(22,GPIO.LOW) def t_close():GPIO.setup(22,GPIO.IN)def check_for_direction(position_x):GPIO.setmode(GPIO.BOARD)GPIO.setwarnings(False)GPIO.setup(11,GPIO.OUT)GPIO.setup(12,GPIO.OUT)GPIO.setup(15,GPIO.OUT)GPIO.setup(16,GPIO.OUT)GPIO.setup(38,GPIO.OUT)if position_x == 0 or position_x == width:print 'out of bound't_stop()if position_x <= ((width-tracking_width)/2 - tracking_width): print 'move right!'t_right()elif position_x >= ((width-tracking_width)/2 + tracking_width): print 'move left!'t_left()else:# print 'move front't_up()# initialize the camera and grab a reference to the raw camera capture camera = PiCamera()camera.resolution = (width, height)camera.framerate = 32rawCapture = PiRGBArray(camera, size=(width, height))rawCapture2 = PiRGBArray(camera, size=(width, height))# allow the camera to warmuptime.sleep(0.1)# set the ROI (Region of Interest)c,r,w,h = (width/2 - tracking_width/2), (height/2 - tracking_height/2), tracking_width, tracking_heighttrack_window = (c,r,w,h)# capture single frame of tracking imagecamera.capture(rawCapture2, format='bgr')# create mask and normalized histogramroi = rawCapture2.array[r:r+h, c:c+w]hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv_roi, np.array([0,30,32]), np.array([180,255,255]))roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0,180])cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 80, 1)# capture frames from the camerafor frame in camera.capture_continuous(rawCapture, format='bgr', use_video_port=True):# grab the raw NumPy array representing the image, then initialize the timestamp# and occupied/unoccupied textimage = frame.array# filtering for tracking algorithmhsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)dst = cv2.calcBackProject([hsv], [0], roi_hist, [0,180], 1)ret, track_window = cv2.meanShift(dst, track_window, term_crit)x,y,w,h = track_windowcv2.rectangle(image, (x,y), (x+w,y+h), 255, 2)cv2.putText(image, 'Tracked', (x-25, y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)# show the framecv2.imshow("Raspberry Pi RC Car", image)key = cv2.waitKey(1) & 0xFFcheck_for_direction(x)time.sleep(0.01)# clear the stream in preparation for the next frame rawCapture.truncate(0)。
基于树莓派和GPS导航的智能避障小车设计
计算机科学与人工智能河南科技Henan Science and Technology总第811期第17期2023年9月收稿日期:2023-04-12作者简介:李承泽(2002—),男,本科生,研究方向:电子信息科学与技术。
基于树莓派和GPS 导航的智能避障小车设计李承泽(西北大学信息科学与技术学院,陕西西安710119)摘要:【目的】实现无人驾驶智能多功能小车的自动感知、规避障碍物功能,并使其按GPS 导航的路径行驶。
【方法】基于树莓派和GPS 导航对智能避障小车进行设计,以自主开发的多功能控制系统为小车的指挥协调中枢,从而实现小车高速行驶时的黑线循迹单元功能。
同时,系统通过轮询机制来实现均衡负载,可确保小车的操作能准确感知规避障碍物,并减少由每1s 进行一次数据传输造成的系统繁忙或网络拥塞。
【结果】研究结果表明,智能避障小车可自动准确地感知和规避障碍物,并按规划路径行驶。
【结论】基于树莓派和GPS 导航的智能避障小车设计具有良好的商业应用前景。
关键词:树莓派;GPS 导航;多功能控制系统;自动驾驶中图分类号:TP368.1文献标志码:A文章编号:1003-5168(2023)17-0031-04DOI :10.19968/ki.hnkj.1003-5168.2023.17.006Design of Intelligent Obstacle Avoidance Vehicle Based on RaspberryPi and GPS NavigationLI Chengze(School of Information Science and Technology,Northwestern University,Xi'an 710119,China)Abstract:[Purposes ]This paper aims to realize the automatic perception and obstacle avoidance functionof the unmanned intelligent multi-functional vehicle,and make it travel according to the path of GPS navigation.[Methods ]Based on Raspberry Pi and GPS navigation,the intelligent obstacle avoidance carwas designed.The self-developed multi-functional control system was used as the command and coordi⁃nation center of the car,so as to realize the black line tracking unit function when the car was running athigh speed.At the same time,the system realizes balanced load through the polling mechanism,which can ensure that the operation of the car can accurately perceive and avoid obstacles,and reduce the sys⁃tem busyness or network congestion caused by data transmission every 1s.[Findings ]The results show that the intelligent obstacle avoidance vehicle can automatically and accurately perceive and avoid ob⁃stacles,and drive according to the planned path.[Conclusions ]The design of intelligent obstacle avoid⁃ance vehicle based on Raspberry Pi and GPS navigation has a good commercial application prospect.Keywords:Raspberry Pi;GPS navigation;multifunctional control system;autonomous driving0引言基于GPS 的树莓派智能小车可通过状态分析系统来自动规划路线和识别交通信号,从而保证车辆的安全运行[1-5]。
基于树莓派的智能抓取小车系统设计与实现
基金项目:2019年湖南涉外经济学院大学生创新创业训练计划项目;项目名称:湖南涉外经济学院自动化校级一流本科专业建设项目;项目编号:[201954]㊂作者简介:戴镖(1999 ),男,湖南长沙人,本科生;研究方向:信号处理㊂∗通信作者:康钦清(1982 ),女,湖南邵阳人,讲师,硕士;研究方向:信号处理㊂戴㊀镖,康钦清∗,杨㊀鑫,何学良,李㊀松,刘巧玲(湖南涉外经济学院信息与机电工程学院,湖南㊀长沙㊀410205)摘㊀要:随着社会发展,老年人和残疾人的日常生活日益受到关注㊂为协助他们完成难度较大的动作,特设计一款带机械臂的智能小车㊂小车通过摄像头采集当前环境信息,传递至手机或者电脑端,用户确定抓取目标的位置,控制机械手完成物品抓取㊂文章设计中选取树莓派开发板,实现了小车的遥控控制㊁循迹避障㊁可视化抓取等操作㊂增加的两个反射式红外线光电传感器,提升了单一超声波避障模块的避障效果㊂本设计借助机械臂以及摄像头,使小车能实现对物体的远程观察及抓取,使用户的日常生活更加便利㊂关键词:机械臂;智能小车;树莓派;循迹避障;遥控抓取0㊀引言智能小车和机械臂是机器人技术领域应用最广泛的自动化机械设备,研究可进行抓取作业的搭载机械手臂的智能小车,具有一定的实用性[1]㊂从1960年开始,自世界上首台工业机器人被发明,智能机器人的研究已有近60年的历史,其应用渗透到方方面面,越来越多智能机器人代替人类从事极端环境下的操作[2-3]㊂老年人和残疾人的日常生活便利性越来越受关注㊂本设计尝试实现对物体的远程观察及抓取,帮助用户解决抓取物品等困难问题,使用户的日常生活更加便利㊂1㊀系统总设计1.1㊀系统设计目标(1)通过移动智能终端设备的操作界面,实现小车运动控制㊂(2)通过获取车载摄像头采集实时图像㊂(3)通过控制界面控制小车和机械手的操作㊂(4)小车具有一定的自主循迹和避障功能㊂1.2㊀系统构成智能抓取的功能核心是实现小车的移动与机械臂抓取㊂总控制中心是树莓派开发板,可搭载各种模块㊂通过接收遥控信号并解码,控制电机驱动模块,控制对应电机,完成小车的前后左右及机械臂的操作㊂通过红外发光二极管将红外线发射到外光敏三极管接收传感器上,使低电平变为高电平,从而完成循迹㊂最后,通过超声波传感器以及红外线避障传感器感知障碍物,并完成避障操作㊂2㊀硬件设计2.1㊀芯片选择本设计通过分析常用的STM32,P89V51RD2FA 以及树莓派开发板,综合考虑其实用性和功能性,选择了功能强大且更加兼容的树莓派㊂本小车采用的树莓派4B 有64位1.5GHz 主频的四核芯Cortex A72架构,BCM2711芯片,4GB 的DDR4内存,性能升级幅度大㊂2.2㊀驱动模块本设计中每个车轮均有一个电机,电机为120转12V 的直流减速电机,选用TB6612FNG 芯片作为驱动㊂该芯片由MOSFET 的H 桥集成电路组成,相比L293D,每通道平均600mA 的驱动电流和1.2A 的脉冲峰值电流[4],其输出负载能力提高了一倍㊂相比L298N 的散热性能以及外围二极管续流电路,其无须外加散热板块,散热能力比L298N 强一倍㊂小车运动芯片为双驱动芯片,每一个驱动分别通过控制其STBY 与输入/输出(Input /Output,I /O)口来控制一个电机,如果要电机停止工作,则需要将I /O 口清零㊂正反转的控制则由AIN1,2与BIN1,2置1或者置0来操控㊂2.3㊀机械臂抓取模块在机械手臂控制的传统系统中大多采用单片机控制,容易在控制电机运行时产生驱动IC 故障,或由于驱动IC 过热直接烧毁控制电机㊂本设计采用亚克力板材质的4自由度机械臂,通过PCA9685芯片来控制舵机的操作㊂16路脉冲宽度调制(Pulse Width Modulation,PWM)模块,两条线可以分别控制16路,实现I 2C 通信㊂相比TLC5940芯片,本设计使用的PAC9685具有单独的PWM 驱动器与一个时钟,不需要一直发送信号㊂6地址选择引脚将使62个驱动板全部挂在单个I 2C 总线上,总计992路PWM 的输出,输出非常庞大㊂2.4㊀循迹避障模块本设计采用的是3块TCRT5000红外线循迹传感器㊂循迹传感器探测距离为0.1~2.5cm㊂当小车下方贴黑色胶带时,红外线会被黑色胶带吸收,从而无法反射回来㊂此时红外接收管则处于关断状态,输出端为高电平,从而带动小车按照黑色胶带运行㊂超声波探测能够进行定向传播,超声波探测使用的是I /O 口TRIG 来触发测距[5]㊂模块自动发送8个第17期2020年9月无线互联科技㊃设计分析No.17September,202040kHz的方波,接收器会检测信号的返回㊂信号返回时,通过I/O口ECHO输出一个高电平,持续时间是超声波从发射到返回所需时间㊂但是出现两个及以上障碍物时,超声波检测会出现偏差,而红外避障距离较短,一般在0.5m内能够准确探测实时障碍物,从而解决了多个障碍物的探测问题,且对移动物体探测具有优良的准确性㊂因此,本文采用了一个超声波模块与两个红外探测传感器搭配使用的方式,提高了避障的性能㊂3个循迹传感器分别与GPIO13,GPIO19,GPIO26相连接,而两个避障传感器则分别接入GPIO16,GPIO12㊂最后接入的是超声波探距模块,分别接入GPIO28㊁GPIO29㊂整个循迹避障模块均采用5V稳压供电㊂3㊀软件设计3.1㊀启动界面该小车借助相关App对其工作进行控制㊂本设计采用Python语言对小车App按钮启动程序进行编程㊂开机后,等待系统启动,通过 小车移动 机器臂移动抓取 图像采集 等按钮来控制小车㊂通过相关软件测试可以有效测试出按钮的灵敏度以及和小车的良好交互性与协调性㊂3.2㊀机械臂运动设计机械手臂的运动函数包括机械手臂手爪打开㊁机械手臂手爪闭合㊁上臂舵机向上㊁上臂舵机向下㊁下臂舵机向上㊁下臂舵机向下㊁小车底座左转㊁小车底座右转等运动函数㊂在抓取目标物体时,应该不干扰其他物体㊂根据下标算出其抓取物体时的关节角参数,从而判断机械臂爪的运动轨迹㊂在抓取功能的测试中,小车对一定形状㊁尺寸的物品可以比较灵活顺利地抓取㊂4㊀循迹避障在红外传感器红外探头接收红外信号的不同情况下,小车所处的运动情况不同㊂设置小车的3个红外传感器探头按左中右排序分别为LED-0,LED-1,LED-2㊂当LED-0,LED-2为点亮状态,LED-1处于熄灭状态时,说明小车前部的中间红外探头在黑线上面,证明此时小车的方向为正方向,可以要求小车继续直行㊂当LED-0为熄灭状态,LED-1,LED-2处于点亮状态时,说明红外传感器左红外探头在黑线上,证明小车此时的状态是斜方向头部指向右边,需要小车转向左边,才能使小车行驶方向继续回到正前方,从而确保了小车的正确行驶方向[5]㊂5㊀结语本设计的研究对象是拥有机械手臂的智能抓取小车,主要探究了小车的正常移动㊁循迹避障㊁智能抓取等功能的实现㊂在智能小车上装取机械手臂并借助摄像头,使用户可以远程遥控小车进行物品的抓取㊂App的控制按键与小车抓取功能具有比较好的协调性㊂整个系统满足智能抓取功能的相关需求,达到预期目的,对后续自主抓取智能小车的研究具有一定的借鉴意义与实用价值㊂[参考文献][1]郗郡红.搭载机械手的智能轮式小车目标识别及抓取控制研究[D].天津:天津科技大学,2015.[2]罗爱华.全自主机器人避障及路径规划研究[D].赣州:江西理工大学,2010.[3]贺晨宇.移动机器人多角度摄像技术[D].呼和浩特:内蒙古大学,2012.[4]滕志军.基于超声波检测的倒车雷达设计[J].今日电子,2006(9):78-79.[5]张驰,廖华丽,周军.基于单目视觉的工业机器人智能抓取系统设计[J].机电工程,2018(3):283-287.(编辑㊀姚㊀鑫) Design and implementation of smart grab car system based on RaspberryPi Dai Biao,Kang Qinqing∗,Yang Xin,He Xueliang,Li Song,Liu Qiaoling (School of Information and Electrical Engineering,Hunan International Economics University,Changsha410205,China) Abstract:With the development of society,the daily life of the elderly and the disabled has been paid more and more attention.In order to help them complete the difficult operation in life,a smart car with a mechanical arm is designed.The car collects the current environmental information through the camera and transmits it to the mobile phone or computer.The user determines the position of the grab target and controls the manipulator to complete the grab.In this design, RaspberryPi development board is selected to realize the remote control,track avoidance,visual grasping and so on.The addition of two reflective infrared photoelectric sensors improves the obstacle avoidance effect of a single ultrasonic obstacle avoidance module.This design uses the manipulator and the camera,so that the car can realize the remote observation and grab of objects,so that the daily convenience of users.Key words:mechanical arm;smart car;RaspberryPi;track avoidance;remote control grab。
基于树莓派4B的循迹避障小车设计
基于树莓派4B的循迹避障小车设计
李文海;郭伟;宋莉
【期刊名称】《计算机与网络》
【年(卷),期】2022(48)19
【摘要】设计实现了一种基于树莓派4B的循迹避障智能小车系统,以快速、准确
地完成交通标识识别、避障、循迹任务作为研究目标。
智能小车利用LeNet网络
架构进行交通标识识别,超声波测距传感器进行避障决策,摄像头模组进行循迹行驶。
实验结果表明,智能小车能够在实际搭建的环境下,完成交通标识识别、避障、循迹
的任务,且具有准确率高、稳定性好、泛化能力强的特点。
【总页数】5页(P53-57)
【作者】李文海;郭伟;宋莉
【作者单位】马鞍山学院人工智能创新学院
【正文语种】中文
【中图分类】TP393
【相关文献】
1.基于树莓派的智能预警避障小车设计
2.基于树莓派的自动避障小车的设计与实现
3.基于树莓派的自动避障小车的设计与实现
4.基于STM32的智能小车循迹避障测距的设计
5.基于STM32的循迹避障小车设计
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对于有C语言基础的同学学习用WiringPi控制树莓派的GPIO,掌握C语言并应用到自己的实践 中。
硬件
树莓派3代B型主板 部分配件 别小看树莓派 相信出色的你能玩出更多新花样 先看一下我制作的哪些功能 红外避障 黑线循迹 手机软件控制 Scratch编程 红外跟随 下面开始进入主题 为了节省工作量呢 我从C语言版本开始说。 系统配置中文环境和拼音我就不罗嗦了 sudo apt-get install ttf-wqy-zenhei (安装中文字体库) sudo apt-get install scim-pinyin (安装中文输入法 当然了你也可以全装其他的输入法) 我建议最好用远程桌面的方式连接,以便小车运行时方便修改代码。 树莓派安装xrdp 就可以直接用笔记本自带的远程桌面工具进行远程操作了。最新的系统安 装步骤: sudo apt-get install xrdp sudo apt-get install tightvncserver 然后在windows打开远程桌面连接 打开对应的IP地址,即可连接成功 远程桌面界面
digitalWrite函数
函数原型void digitalWrite (int pin, int value) ;使用该函数可以向指定的管脚写入 HIGH(高)或者LOW(低)写入前,需要将管脚讴置为输出模式。wiringPi将任何的非0值作 为HIGH(高)来对待,因此,0是唯一能够代表LOW(低)的数值。如下图,定义小车前进 时,将GPIO1置为高GPIO4置为低(左侧前进),将GPIO5置为高GPIO6置为低(右侧前进)。 通过接收到的字符进而控制小车动作 全部代码占用篇幅。完整代码稍后评论区 组装小车 树莓派引脚接线 整体供电使用两节3.7V的18650锂电池。树莓派需要5V供电,所以需要使用一个转5V的降压 模块Lm2596模块。编译carserver.c然后等组装好之后运行。
简单看一下树莓派上即 服务端代码:carserver.c 几种初始化wiringPi的函数
首先在程序的开始的时候需要调用上面的任意的函数来对wiringpi 进行初始化,否则你的 程序不能正常工作。wiringPiSetup() 该函数初始化wiringPi,幵假定程序将使用wiringPi 的管脚定义图。具体管脚映射,可以通过gpio readall命令来查看。该函数需要root权限。 驱动电机使用四个引脚。1、4控制一侧,5、6另外一侧。编码方式为wPi。 引脚定义
pinMode函数
原型 void pinMode (int pin, int mode) ;使用该函数可以将某个引脚配置为INPUT(输 入)、 OUTPUT(输出) 、PWM_OUTPUT (脉冲输出) 或者GPIO_CLOCK(时钟)。在我们的 小车C语言控制程序中我们分别设置了GPIO1,GPIO4,GPIO5,GPIO6这四个引脚来控制左右 两侧的电机。此时我们是通过GPIO的输出来实现的,所以这里设置mode为OUTPUT。
C语言版
树莓派官方系统自带Gcc编译器 , 只需安装编译WiringPi库。
Python版
最近的系统已经默认安装了python-RPi.GPIO ,进行无线网络远程遥控的时候需安装 pip,flask。
Scratch
什么都不用动 打开Scratch软件 设置GPIOSERVER ON就可以了。
青少年可以从SCRATCH编程中学习编程思想,以及算法基础并养成良好的逻辑思维。
安卓软件APP源码就不贴出来了。需要的话可以给我留言。 Scratch控制版
部分源码 好累 ,,能不能偷个懒。python代码原理大同小异。初始化GPIO,定义小车点后左右停止 的函数。然后通过GET POST方法发送接收信号。然后控制树莓派进行响应。
引言
当我们手里有一个树莓派的时候,就可以发挥自己的想象力。创造出与众不同的各种东西。 搭建网络服务器、私有云、网络监控器、无人机航模、行走机器人等等等等。今天呢,教大 家如何把手里的树莓派用起来。玩转树莓派嘛 怎么可能让你的树莓派放在角落里吃灰呢。
软件
我将提供大家三种不同语言的小车控制程序所以运行环境请根据需要搭建。系统版本可以是 树莓派Raspbian Jessie或者Ubuntu等。视频网络传输Mjpgstreamer. 我配置好运行环境之后制作的镜像系统
C语言安装wiringPi库 WringPI库介绍
wiringPi 安装
方案 A——使用 GIT 工具,通过 GIT 获得 wiringPi 的源代码。
git clone git:///wiringPi
测试一下是否装成功:
$gpio -v
先来搭建手机远程控制的功能,稍后再进行与传感器的结合。