玩转树莓派 树莓派智能小车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(15,True) #右侧轮子前进
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语言代码

.//智能小车避障、循迹、红外遥控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程序(绝版模块化程序)

寻迹避障小车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控制小车

【树莓派】树莓派⼩车(三)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制作遥控小车全攻略 本文主要描述使用树莓派和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各自的上下两个针脚是用跳线帽连接起来的,拔掉就可以接线了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高中到大学可以进阶初步学习Python/C语言编程,Python语言是一种较为容易入门的机器学 习语言。
对于有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
先来搭建手机远程控制的功能,稍后再进行与传感器的结合。
相关文档
最新文档