前言:本学期选择了嵌入式课程,打算以后走web我觉得这门课对我来说主要用的是学习操作系统,看了某个内部的视频课,学完了UnixC部分让我受益匪浅,但看到裸板的开发和驱动程序让我停下来,以后继续学习需要很多时间和精力。在这里我妥协了(不要在专业方向花太多时间),但是为了不把这门课弄坏或者进入嵌入式门,我买了一个覆盆子派,写了一些有趣的小项目。
写代码之前
1. 连接树莓派:一开始选择ssh连接,后来学会了串口连接(硬件层面的连接)和嵌入式搭点边,但是ssh真的很香。在开发过程中,我还是选择了ssh连接
2. GPIO嘴和高低电平:我是计算机专业,不是电子专业。我只知道这些。反正是树莓派提供的。GPIO口,可以input或者output用于外接其他设备的高电平和低电平代码类似于驱动程序来处理一些逻辑(听老师说驱动程序需要带什么操作系统,我的覆盆子派不是纯裸板,不能从专业专业嵌入式编程)
3. 环境:树莓派4b 一堆杜邦线 笔记本电脑网线路由器 路由器网线路由器 无源蜂鸣器,有源蜂鸣器,面包板, LED小灯珠,声敏光敏传感器4*4小键盘等
项目1:高分贝报警器
input:声敏传感器 output:无源蜂鸣器
简介:简单IO
import RPi.GPIO as GPIO import time import signal INPUT = 12 OUTPUT = 25 def sound(i, o, t): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(o, GPIO.OUT) GPIO.setup(i, GPIO.IN) def handler(signum, frame): GPIO.output(o, GPIO.LOW) exit(0) signal.signal(signal.SIGINT, handler) while 1: if GPIO.input(i) != 0: GPIO.output(o, GPIO.HIGH) time.sleep(t) else: GPIO.output(o, GPIO.LOW) sound(INPUT, OUTPUT, 0.1)
项目2:简陋钢琴
input:4*4键盘 output:有源蜂鸣器
简介:这个是期中写的项目,期末现在写博客懒得改细节了 ,music类是根据12平均律输出音符,具体部分看乐理书去,keyboarg_music类是调用了music类根据键盘输入输出音符(这里最好键盘封装一个类,music封装一个,调用写一个程序好一点,不过我懒的改了),使用手册如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1-12为C到B 13降一个8度,14升一个8度,15回到中间的8度,16输出小星星(你可以自己改代码写曲子)
# Music.py
import RPi.GPIO as GPIO
import time
class Music:
# c1_ is c1#
c1 = 33
c1_ = 35
d1 = 37
d1_ = 39
e1 = 41
f1 = 44
f1_ = 46
g1 = 49
g1_ = 52
a1 = 55
a1_ = 58
b1 = 62
c2 = 65
c2_ = 69
d2 = 73
d2_ = 78
e2 = 82
f2 = 87
f2_ = 93
g2 = 98
g2_ = 104
a2 = 110
a2_ = 117
b2 = 123
c3 = 131
c3_ = 139
d3 = 147
d3_ = 156
e3 = 165
f3 = 175
f3_ = 185
g3 = 196
g3_ = 208
a3 = 220
a3_ = 233
b3 = 247
c4 = 262
c4_ = 277
d4 = 294
d4_ = 311
e4 = 330
f4 = 349
f4_ = 370
g4 = 392
g4_ = 415
a4 = 440
a4_ = 466
b4 = 494
c5 = 523
c5_ = 554
d5 = 587
d5_ = 622
e5 = 659
f5 = 698
f5_ = 740
g5 = 784
g5_ = 831
a5 = 880
a5_ = 932
b5 = 988
c6 = 1047
c6_ = 1109
d6 = 1175
d6_ = 1245
e6 = 1319
f6 = 1397
f6_ = 1460
g6 = 1568
g6_ = 1661
a6 = 1760
a6_ = 1865
b6 = 1976
c7 = 2093
c7_ = 2217
d7 = 2349
d7_ = 2489
e7 = 2537
f7 = 2794
f7_ = 2960
g7 = 3136
g7_ = 3322
a7 = 3520
a7_ = 3729
b7 = 3951
def __init__(self):
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(12, GPIO.OUT)
GPIO.output(12, GPIO.HIGH)
def outOne(self, note, t):
buzz = GPIO.PWM(12, note)
buzz.start(50)
time.sleep(t)
buzz.stop()
def get_mode_list(self):
ret = [
[[self.c1, self.c1_, self.d1, self.d1_],
[self.e1, self.f1, self.f1_, self.g1],
[self.g1_, self.a1, self.a1_, self.b1],],
[[self.c2, self.c2_, self.d2, self.d2_],
[self.e2, self.f2, self.f2_, self.g2],
[self.g2_, self.a2, self.a2_, self.b2],],
[[self.c3, self.c3_, self.d3, self.d3_],
[self.e3, self.f3, self.f3_, self.g3],
[self.g3_, self.a3, self.a3_, self.b3],],
[[self.c4, self.c4_, self.d4, self.d4_],
[self.e4, self.f4, self.f4_, self.g4],
[self.g4_, self.a4, self.a4_, self.b4],],
[[self.c5, self.c5_, self.d5, self.d5_],
[self.e5, self.f5, self.f5_, self.g5],
[self.g5_, self.a5, self.a5_, self.b5],],
[[self.c6, self.c6_, self.d6, self.d6_],
[self.e6, self.f6, self.f6_, self.g6],
[self.g6_, self.a6, self.a6_, self.b6],],
[[self.c7, self.c7_, self.d7, self.d7_],
[self.e7, self.f7, self.f7_, self.g7],
[self.g7_, self.a7, self.a7_, self.b7],],
]
return ret
def out_star(self):
buzz = GPIO.PWM(12, 440)
star = [self.c4, self.c4, self.g4, self.g4, self.a4, self.a4, self.g4]
for i in star:
buzz.ChangeFrequency(i)
buzz.start(50)
time.sleep(0.4)
buzz.stop()
time.sleep(0.1)
if __name__ == "__main__":
pass
# keyboard_music.py
import RPi.GPIO as GPIO
import time
import Music
import signal
class keybroad:
rows = [17, 27, 22, 16]
columns = [5, 6, 13, 26]
keybroad_map = [
["1","2","3","4"],
["5","6","7","8"],
["9","10","11","12"],
["A","B","C","D"]]
m = Music.Music()
mode_list = m.get_mode_list() # 7s 8
curMode = 3
def __init__(self):
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
for row in self.rows:
GPIO.setup(row, GPIO.OUT)
for col in self.columns:
GPIO.setup(col, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def deal(self, x, y):
t = 0.2
if x < 3:
self.m.outOne(self.mode_list[self.curMode][x][y], t)
elif y == 0:
if self.curMode > 0:
self.curMode -= 1
elif y == 1:
if self.curMode < 6:
self.curMode += 1
elif y == 2:
self.curMode = 3
elif y == 3:
self.m.out_star()
else:
print(x, y)
def start(self):
while 1:
for i in range(len(self.keybroad_map)):
GPIO.output(self.rows[i], GPIO.HIGH)
for j in range(len(self.columns)):
if (GPIO.input(self.columns[j]) == 1):
self.deal(i, j)
time.sleep(0.3)
GPIO.output(self.rows[i], GPIO.LOW)
def check(self, code):
ret = 0
for i in range(len(self.keybroad_map)):
GPIO.output(self.rows[i], GPIO.HIGH)
for j in range(len(self.columns)):
if (GPIO.input(self.columns[j]) == 1 and code == self.keybroad_map[i][j]):
ret = 1
GPIO.output(self.rows[i], GPIO.LOW)
return ret
def handler(signum, frame):
exit(0)
if __name__ == "__main__":
signal.signal(signal.SIGINT, handler)
k = keybroad()
k.start()