功能: 通过光敏电阻检测当前光强,通过按键设置光强范围来自动控制窗帘开关,同时可以通过按键手动控制窗帘开关,包含的电路有显示电路、按键电路、窗帘电机控制电路、传感器电路、单片机电路等。 ?123456789101112131415161718192021222324252627282930313233#include <reg52.h>       #define uchar unsigned char#define uint unsigned int#define yi 0x80       //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40) uchar display_digit[]={0,0,0};uchar yuzhi[]={0,0,0};uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-Auchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D sbit R_D=P2^0;sbit W_R=P2^1;  sbit C_S=P2^2;   sbit Up=P2^3;       sbit Down=P2^4;      sbit rw=P2^5;        //液晶读写端sbit rs=P2^6;        //液晶指令/数据输入控制sbit en=P2^7;        //液晶使能端 sbit AD_data=P1;     sbit bianji=P3^4;sbit jia=P3^7;sbit jian=P3^6; uint adval; uint fazhi=180;uchar state=1;//1为窗帘打开,0为窗帘关闭 uchar zhuangtai=1;//1为窗帘打开,0为窗帘关闭 
查看详情
                      情境: 希望能根据光线强弱,自动开关窗帘,例如天亮了,在一定亮度下,把窗帘打开,方便我们的生活 材料: 1、microbit控制板 2、robotbit扩展板 3、光线传感器 4、28BYJ-48 步进电机或舵机 6、连线 原理: 步进电机是将电脉冲信号转变为角位移,可以精确的控制转动的角度。 舵机也可以精确控制转动的角度,但只限于(0~180)之间 连线: 步进接扩展板的M2,或舵机接扩展板s1 光线传感器接扩展板pin1 编程环境: 支持robotbit的Mu编辑器   from microbit import * import robotbit robotbit.servo(0,0) while True: light = pin1.read_analog() if light < 200: robotbit.servo(0,180) sleep(1000) robotbit.servo(0,0)   import robotbit from microbit import * while True: light=pin1.read_analog() #读取光敏传感器传递过来的模拟量数据 #数值越大说明光照度越小,也是就是越暗 if light > 400: if isOpen: isOpen=False robotbit.stepper(0,360)#光照小于设定的值,关闭窗帘 else: if isOpen==False: isOpen=True robotbit.stepper(0,-360)#光照大于设定的值,打开窗帘 display.show(Image.ALL_ARROWS,delay=1000,loop=True)   注意事项: 舵机是由扩展板供电,因此,要看到效果,需要把扩展板开关打开 可用手机电筒照射光线传感器,模拟天亮了。
查看详情
                    伺服电机(Servo Motor): 伺服电机确实是一个包含电机(直流、交流等)、传感器(如霍尔编码器或光电编码器)和控制器(如单片机)的系统。由于有传感器反馈(闭环系统),它可以精确知道电机转了多少圈,目前到什么角度,即使关机重启也能知道当前角度。 伺服电机通过编码器实时反馈位置信息,确保高精度和高响应性。 舵机: 舵机也是一种伺服电机,主要用于需要角度控制的应用,如航模、机器人等。它的名字来源于航模爱好者,因为他们在控制模型时需要精确的角度控制。 舵机通常使用PWM信号进行控制,具有较小的转角范围(通常为0-180度),并且内置位置反馈(如电位器),实现闭环控制。 步进电机(Stepping Motor): 步进电机通过定子线圈序列通电,顺次在不同的角度形成磁场,推拉定子旋转。由于没有测量电机转角的传感器反馈(开环系统),所以无法知道当前的角度,转了几圈。 步进电机可以通过加装编码器来实现闭环控制,达到精确控制角度的功能。这样,步进电机也可以具备类似伺服电机的高精度控制能力。   # 型号:28BYJ-48 # 驱动:ULN2003 # 减速比:1/64(即内部马达转64圈,经过减速齿轮后外部的连接杆转一圈) # 步进角度:0.088°(内部转64圈外部转一圈,那么内部转一圈外部转360/64=5.625°,而内部转1圈需要64个步进,则一步进就是5.625/64=0.088° # 5线四相8拍(即内部马达,8个脉冲一个循环) # 速度:1000步/s(极限每运动一步需要0.001s) # 参考:https://blog.csdn.net/qq_41328470/article/details/125171300 import RPi.GPIO as GPIO import time import random # 设置GPIO模式 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) # 定义步进电机连接的BCM引脚 IN1 = 25 IN2 = 8 IN3 = 7 IN4 = 1 # 设置引脚为输出 GPIO.setup(IN1, GPIO.OUT) GPIO.setup(IN2, GPIO.OUT) GPIO.setup(IN3, GPIO.OUT) GPIO.setup(IN4, GPIO.OUT) # 定义步进电机的8个控制顺序(1拍为一个步进,一个步进角为电机运动的最小单位,8个拍为一个循环,内机转一圈需要8个循环,即64拍) # 此序列为逆时针,顺时针的话数组倒序 sequence = [ # [IN1,IN2,IN3,IN4] [1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1], [1, 0, 0, 1] ] sequenceRV = list(reversed(sequence)) def rotate(angle): seq = sequence if angle >= 0 else sequenceRV # 因传动比是1/64,所以外机转一圈,需要内机转64圈,而内机转一圈需要64个步进,所以外机转一圈内机需要64*64=4096步 stepNum = (int)(abs(angle) / 360 * 4096) for i in range(stepNum): # 8步一个序列循环 step = seq[i % 8] GPIO.output(IN1, step[0]) GPIO.output(IN2, step[1]) GPIO.output(IN3, step[2]) GPIO.output(IN4, step[3]) # 调整步进电机的速度 time.sleep(0.001) return i = 20 while(i > 0): angle = random.randint(10, 90) rotate(angle) #time.sleep(1) rotate(-angle) i = i - 1 # 清理GPIO引脚,全部置零,防止电机一直有输入导致发烫 GPIO.cleanup()  
查看详情
                      原理图:   接口说明                 A控制信号输入------PWMA               VM ------电机驱动电压输入端(4.5V-15V)                    A电机输入端2 ------AIN2                VCC ------逻辑电平输入端(2.7V-5.5V)                    A电机输入端1 ------AIN1                GND ------ 接地 正常工作/待机状态控制端------STBY                 AO1 ------- A电机输出端1                     B电机输入端1------BIN1                AO2 ------ A电机输出端2                     B电机输入端2------BIN2                BO2 ------ B电机输出端2             B控制信号输入端------PWMB                BO1 ------ B电机输出端1                                    接地------GND                GND ------- 接地    该实验的基础是两块并联在一起的驱动模块,所以和单独一个驱动模块有些许差别。 其他关于该驱动模块的介绍详见百度。 不多说,上代码。 import RPi.GPIO as GPIO import time PWMA = 18 AIN1 = 22 AIN2 = 27 PWMB = 23 BIN1 = 25 BIN2 = 24#该驱动模块调速区间为[0-100] #前进 def t_up(speed,t_time): L_Motor.ChangeDutyCycle(speed) GPIO.output(AIN2,False)#AIN2 GPIO.output(AIN1,True) #AIN1 R_Motor.ChangeDutyCycle(speed) GPIO.output(BIN2,False)#BIN2 GPIO.output(BIN1,True) #BIN1 time.sleep(t_time) #停止 def t_stop(t_time): L_Motor.ChangeDutyCycle(0) GPIO.output(AIN2,False)#AIN2 GPIO.output(AIN1,False) #AIN1 R_Motor.ChangeDutyCycle(0) GPIO.output(BIN2,False)#BIN2 GPIO.output(BIN1,False) #BIN1 time.sleep(t_time) #后退 def t_down(speed,t_time): L_Motor.ChangeDutyCycle(speed) GPIO.output(AIN2,True)#AIN2 GPIO.output(AIN1,False) #AIN1 R_Motor.ChangeDutyCycle(speed) GPIO.output(BIN2,True)#BIN2 GPIO.output(BIN1,False) #BIN1 time.sleep(t_time) #左转 def t_left(speed,t_time): L_Motor.ChangeDutyCycle(speed) GPIO.output(AIN2,True)#AIN2 GPIO.output(AIN1,False) #AIN1 R_Motor.ChangeDutyCycle(speed) GPIO.output(BIN2,False)#BIN2 GPIO.output(BIN1,True) #BIN1 time.sleep(t_time) #右转 def t_right(speed,t_time): L_Motor.ChangeDutyCycle(speed) GPIO.output(AIN2,False)#AIN2 GPIO.output(AIN1,True) #AIN1 R_Motor.ChangeDutyCycle(speed) GPIO.output(BIN2,True)#BIN2 GPIO.output(BIN1,False) #BIN1 time.sleep(t_time) GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(AIN2,GPIO.OUT) GPIO.setup(AIN1,GPIO.OUT) GPIO.setup(PWMA,GPIO.OUT) GPIO.setup(BIN1,GPIO.OUT) GPIO.setup(BIN2,GPIO.OUT) GPIO.setup(PWMB,GPIO.OUT) L_Motor= GPIO.PWM(PWMA,100) L_Motor.start(0) R_Motor = GPIO.PWM(PWMB,100) R_Motor.start(0) try: while True: t_up(50,3) t_down(50,3) t_left(50,3) t_right(50,3) t_stop(3) except KeyboardInterrupt: GPIO.cleanup()   需要注意的是由于该电机模块的峰值电流能达到2A/3A,如果发现代码运行一段时间出现了电机停止运行,那么很有可能是电压不够导致了PWM复位。  
查看详情
                    树莓派4B-控制直流电机 一、硬件介绍 树莓派 L298N电机驱动模块 直流电机 外接电源 杜邦线 二、硬件连接 原理图: 注意:ENA和ENB的跳冒必须安上去,如果没有拿杜邦线连通! 三、代码编写 # -*- coding: utf-8 -*- #通过声明可以在程序中书写中文 import RPi.GPIO as GPIO #引入RPi.GPIO库函数命名为GPIO import time #引入计时time函数 # BOARD编号方式,基于插座引脚编号 GPIO.setmode(GPIO.BOARD) #将GPIO编程方式设置为BOARD模式 #接口定义 INT1 = 11 #将L298 INT1口连接到树莓派Pin11 INT2 = 12 #将L298 INT2口连接到树莓派Pin12 INT3 = 13 #将L298 INT3口连接到树莓派Pin13 INT4 = 15 #将L298 INT4口连接到树莓派Pin15 #输出模式 GPIO.setup(INT1,GPIO.OUT) GPIO.setup(INT2,GPIO.OUT) GPIO.setup(INT3,GPIO.OUT) GPIO.setup(INT4,GPIO.OUT) GPIO.output(INT1,GPIO.HIGH) GPIO.output(INT2,GPIO.LOW) GPIO.output(INT3,GPIO.HIGH) GPIO.output(INT4,GPIO.LOW) time.sleep(3) GPIO.cleanup() 四、控制电机转速 接线原理图: 将L298的ENA与ENB分别接到树莓派的Pin16,Pin18接口。ENA与ENB分别为左右电机的使能接口,通过树莓派PWM输出,可以用来控制电机转速。(注:连接时需要将ENA、ENB上的跳帽拔掉) 修改代码为: # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time # 设置编码方式 GPIO.setmode(GPIO.BOARD) # 定义接口 INT1 = 11 INT2 = 12 INT3 = 13 INT4 = 15 ENA = 16 ENB = 18 # 设置为输出模式 GPIO.setup(INT1,GPIO.OUT) GPIO.setup(INT2,GPIO.OUT) GPIO.setup(INT3,GPIO.OUT) GPIO.setup(INT4,GPIO.OUT) GPIO.setup(ENA,GPIO.OUT) GPIO.setup(ENB,GPIO.OUT) # 将pin16和pin18设置频率为80 pwma = GPIO.PWM(16,80) pwmb = GPIO.PWM(18,80) # 设置占空比为90% pwma.start(90) pwmb.start(90) # 输出高低电平 GPIO.output(INT1,GPIO.HIGH) GPIO.output(INT2,GPIO.LOW) GPIO.output(INT3,GPIO.HIGH) GPIO.output(INT4,GPIO.LOW) for i in range(10): pwma.ChangeDutyCycle(90) pwmb.ChangeDutyCycle(90) time.sleep(3) pwma.ChangeDutyCycle(10) pwmb.ChangeDutyCycle(10) time.sleep(3) # 释放接口 GPIO.cleanup() 五、实物图展示
查看详情
                    本文讲述如何通过树莓派的硬件PWM控制好盈电调来驱动RC车子的前进后退,以及如何驱动伺服电机来控制车子转向。 1. 好盈电调简介 总结来说,对于PWM格式要求如下: 1. 电调接收50Hz的PWM信号,即一个周期为20ms. 2. 油门对PWM高电平的响应范围为1ms~2ms,即高电平的占空比为1/20~2/20 3. 默认RC竞速车只有前进控制,则1ms为最低速度,2ms为最高速度;若配置RC竞速车为前进/后退模式,则1.5ms为油门中点,2ms为正向最高油门,1ms为反向最高油门。   对于第三点,则需要配置电调的相关模式以识别PWM的意图。 油门校准配置 备注: 1. 由于此处并无遥控器,因此图中文档的步骤1 就只需要拔插电池电源即可 2. 高、中、低档的PWM输出则需要自己对树莓派编程进行控制 运行模式配置 备注: 1. 不是所有的电调都有这三种运行模式,恰好本文所驱动的WP-10BLS-A-RTR电调只能选择“正转带刹车”或“正反转带刹车”,此处选择红灯闪两次,配置为“正反转带刹车”。   2. 油门驱动设计 调试过程中,树莓派安装在车上,PC通过SSH局域网访问树莓派。因此使用PC键盘的W/S/SPACE键来模拟遥控器的前进/后退/刹车;同时,考虑到键盘只能提供0/1状态输入,故选用R/F键来模拟“档位”--限制当前档位下的W/S的最高油门,以达到换挡加减速的效果。语言表述繁琐,用流程图来表达,大概就是如下效果: 备注:计算速度输出时,可配置相关参数使得油门直接升到最高或经过若干次循环加速后达到当前档位的最大速度。 3. 方向控制设计 此处使用A/D键来控制转向,由于无法获知电机当前的转向角度,因此很难通过逐步增大/减小PWM占空比的方式来控制电机的转向。为简化控制,每次按下按键时触发电机偏转一定的角度,角度值受KEEP_TICK_LIMIT控制,若按住按键不松开,便左或右转向打到底。 逻辑较为简单,直接看代码:  
查看详情