树莓派驱动舵机和DS1302时钟模块
共 3151字,需浏览 7分钟
·
2021-03-25 20:32
事情是这样的,enterdawn想要搭建一个私有云盘,但由于enterdawn学校宿舍每天晚上11点断电,而且enterdawn的移动硬盘盒有一个物理按键,每天断电后都要按一下,所以enterdawn决定让程序去执行这些事情。
准备
万用表:用于测量电压(没有也行,主要是为了避免放错电压烧坏元件)
杜邦线若干:用于连接树莓派和各个模块
MG90S舵机,用于按动开关
DS1302时钟模块:非必须,由于enterdawn宿舍的网络也不稳定,所以需要在无网络的时候也能获取时间,避免晚上停电的时候硬盘未关闭突然断电而坏道。
看懂这篇文章你需要一定的C语言和数电基础。
舵机的安装和使用
首先确保是32位的raspberry pi os(64位的WiringPi库不兼容)。然后安装WiringPi库(安装了可以跳过),到github上clone下来然后./build即可。
舵机使用脉冲信号控制,具体原理此处不赘述。我们可以使用gpio readall
来读取树莓派的IO口。结果如下:
+-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | OUT | 0 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | OUT | 0 | 7 || 8 | 1 | IN | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | ALT5 | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | OUT | 0 | 23 || 24 | 0 | OUT | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
这里选择12号针脚(wPi为1),接舵机的橙色线。然后舵机红色线接任意5V针脚,棕色线接地(任意0V针脚)。
角度 | 输出值 |
---|---|
-90 | 50 |
-45 | 100 |
0 | 150 |
45 | 200 |
90 | 250 |
然后在树莓派终端输入以下代码用来测试:
gpio mode 1 pwm # 设置输出为GPIO1
gpio pwm-ms # 切换到传统模式
gpio pwmc 192 # 设置时钟分频
gpio pwmr 2000 # 每个刻度 0.01 ms,2000 * 0.01ms = 20ms
gpio pwm 1 50
gpio pwm 1 100
gpio pwm 1 150
gpio pwm 1 200
如果测试成功,博客有别人已经写好的驱动程序的链接,点击下方阅读原文,照着改一改就可以了。
我这里旋转45度即可按动开关,实际角度请自己掌握。
DS1302时钟模块的使用
WiringPi项目下的examples文件夹下有一个ds1302.c的文件,我们只需要修改那个文件。
首先修改ds1302setup(int clockPin, int dataPin, int csPin),改为14、30、10,分别为CLK,DAT,RST三个引脚(当然不要忘了为模块接电源)。
然后编译(gcc ds1302.c -o ds1302 -lwiringPi
),运行./ds1302 -rtest
,成功会显示OK。
最后修改setDSclock函数,向后推8小时(即北京时间)即可,因为time函数默认从系统中获取世界时。