# 助教 - 尤宏恩 - 環境:windows, android - 黃士昕 - 環境:Mac, iphone - 使用iphone要開啟 **"最大化相容性"** 樹莓派才可以連接的到 - 在 - 石辛睿翔 - 環境:windows, android ![](https://hackmd.io/_uploads/r15K5Utun.png) # 1. LED * 自行挑戰看看 * 請使用軟體模擬PWM方法完成並完成下列條件: 1. 控制一LED燈使其隨著時間逐漸變亮,待達到亮度最大時停止一秒,接續使LED燈隨著時間逐漸變暗,待達到亮度最小時停止一秒,反覆上述過程。 2. 以KeyboardInterrupt(Crtl+c)例外信號中斷程式,並使用try…except…進行例外處理。 3. LED燈接腳模式請以BOARD為準 範例code : ```javascript= import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(11,GPIO.OUT) pwm = GPIO.PWM(11,60) while True: try: pwm.start(0) for i in range(0,100,5): pwm.ChangeDutyCycle(i) time.sleep(0.1) for i in range(100,0,-5): pwm.ChangeDutyCycle(i) time.sleep(0.1) except KeyboardInterrupt: print('exit') break GPIO.cleanup() ``` # 2. 蜂鳴器 - 睿翔 ```python= import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(12, GPIO.OUT) voice = GPIO.PWM(12, 50) voice.start(50) voice.ChangeFrequency(523) time.sleep(1) voice.ChangeFrequency(587) time.sleep(1) print('end') voice.stop() GPIO.cleanup() ``` # 3. DHT11 - Tony - ![](https://hackmd.io/_uploads/HyPgRBFdh.png) ## 版本確認 - 指令 cat /proc/cpuinfo 可以看到BCM版本,需要去確定一下 - 如果版本不是 BCM2835 的話要去platform_detect.py修改 - cpuinfo : BCM2835 - ![](https://hackmd.io/_uploads/ByCwPIYO2.png) ## 連續偵測程式 - 最下面那一段改成 ```python= while True: try: humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) if humidity is not None and temperature is not None: print(f'Temp={temperature:0.1f}* Humidity={humidity:0.1f}%') else: print('Failed to get reading. Try again!') sys.exit(1) #每格1秒output一次,看輸出的變化 except KeyboardInterrupt: break ``` # 4. 超音波 - Tony - ![](https://hackmd.io/_uploads/HJXEI_tuh.png) - ![](https://hackmd.io/_uploads/B1Fr8dF_n.png) - https://pimylifeup.com/raspberry-pi-distance-sensor/ ## 確認角位 - BCM模式 - GND-GND,VCC-3.3V,TRIG-(號碼),ECHO-(號碼) - 可能需要一下角位輸出是否正確 - 要用平面去偵測距離,若是用手或是曲面他會炸掉 ```python= import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) # 設定 GPIO 的模式為 BCM 模式(Broadcom 腳位編號)。 TRIG = 4 ECHO = 17 # 定義 TRIG 和 ECHO 兩個變量,分別代表超聲波模組的觸發腳位和回聲腳位。 # 可以依自己的腳位去設定 GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) # 使用 GPIO.setup() 函數設定 TRIG 和 ECHO 的引腳模式, # TRIG 設為輸出模式,ECHO 設為輸入模式。 def measure_distance(): GPIO.output(TRIG, False) time.sleep(0.5) # 等待傳感器穩定 GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) pulse_start = time.time() pulse_end = time.time() # 他這邊等於0的時候代表他現在是低電位,也就是他現在沒有收到回程訊號 while GPIO.input(ECHO) == 0: pulse_start = time.time() # 他這邊等於1的時候代表他現在是高電位,也就是他現在收到回程訊號 while GPIO.input(ECHO) == 1: pulse_end = time.time() # 我們將收到的起始跟結束相減就可以獲得他的時間 pulse_duration = pulse_end - pulse_start distance = pulse_duration * 17150 # 乘以聲速(34300 cm/s) # 然後因為來回所以要除2 distance = round(distance, 1) # 四捨五入到小數點後一位 return distance while True: try: distance = measure_distance() print('Distance:', distance, 'cm') time.sleep(1) except KeyboardInterrupt: break GPIO.cleanup() ``` # 5. 聲音感測 - GND-GND,VCC-5V,OUT-GPIO(號碼) - 確認是程式碼問題,還是感測器的問題。 ## 三個角位 ```python= import RPi.GPIO as GPIO import time # GPIO SETUP sound = 17 GPIO.setmode(GPIO.BCM) GPIO.setup(sound, GPIO.IN) def check_sound(): if GPIO.input(sound): print("Sound Detected!") else: print("Sound not Detected!") # infinite loop while True: check_sound() time.sleep(1) GPIO.cleanup() ``` ### 有LED ```python= import RPi.GPIO as GPIO import time #GPIO SETUP sound = 17 led = 27 GPIO.setmode(GPIO.BCM) GPIO.setup(sound, GPIO.IN) GPIO.setup(led,GPIO.OUT) def callback(sound): if GPIO.input(sound): print "Sound Detected!" GPIO.output(led,HIGH) else: print "Sound Detected!" GPIO.output(led,LOW) GPIO.add_event_detect(sound, GPIO.BOTH, bouncetime=300) # let us know when the pin goes HIGH or LOW GPIO.add_event_callback(sound, callback) # assign function to GPIO PIN, Run function on change # infinite loop while True: time.sleep(1) # infinite loop while True: check_sound() time.sleep(3) GPIO.cleanup() ``` ## 四個角位 ```python= import RPi.GPIO as GPIO import time # GPIO SETUP sound_digital = 17 sound_analog = 0 GPIO.setmode(GPIO.BCM) GPIO.setup(sound_digital, GPIO.IN) def check_sound(): if GPIO.input(sound_digital): print("Sound Detected!") else: print("Sound not Detected!") # infinite loop while True: check_sound() time.sleep(3) GPIO.cleanup() ``` # 6. 搖桿 - 還在測試中 ```python= import RPi.GPIO as GPIO import time # 设置GPIO引脚编号模式为BCM GPIO.setmode(GPIO.BCM) # 定义连接到摇杆传感器的GPIO引脚 output_pin_x = 17 output_pin_y = 27 button_pin = 22 vcc_pin = 5 gnd_pin = 6 # 配置GPIO引脚 GPIO.setup(output_pin_x, GPIO.IN) GPIO.setup(output_pin_y, GPIO.IN) GPIO.setup(button_pin, GPIO.IN) GPIO.setup(vcc_pin, GPIO.OUT) GPIO.setup(gnd_pin, GPIO.OUT) # 打开摇杆传感器电源 GPIO.output(vcc_pin, GPIO.HIGH) GPIO.output(gnd_pin, GPIO.LOW) try: while True: # 读取摇杆传感器 X 轴位置值 position_x = GPIO.input(output_pin_x) # 读取摇杆传感器 Y 轴位置值 position_y = GPIO.input(output_pin_y) # 读取摇杆传感器按钮状态 button_state = GPIO.input(button_pin) # 处理摇杆位置和按钮状态 print("X轴位置:{}".format(position_x)) print("Y轴位置:{}".format(position_y)) print("按钮状态:{}".format(button_state)) print("------------------------------------") time.sleep(0.1) except KeyboardInterrupt: # 关闭摇杆传感器电源 GPIO.output(vcc_pin, GPIO.LOW) GPIO.cleanup() ``` # 倒車雷達 ```python= import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) # 設定 GPIO 的模式為 BCM 模式(Broadcom 腳位編號)。 TRIG = 4 ECHO = 17 LED = 11 # 定義 TRIG 和 ECHO 兩個變量,分別代表超聲波模組的觸發腳位和回聲腳位。 # 可以依自己的腳位去設定 GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) # 使用 GPIO.setup() 函數設定 TRIG 和 ECHO 的引腳模式, # TRIG 設為輸出模式,ECHO 設為輸入模式。 GPIO.setup(LED,GPIO.OUT) voice = GPIO.PWM(13,50) voice.start(50) #dc之範圍須為(0.0<dc<100.0) def measure_distance(): GPIO.output(TRIG, False) time.sleep(0.5) # 等待傳感器穩定 GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) pulse_start = time.time() pulse_end = time.time() # 他這邊等於0的時候代表他現在是低電位,也就是他現在沒有收到回程訊號 while GPIO.input(ECHO) == 0: pulse_start = time.time() # 他這邊等於1的時候代表他現在是高電位,也就是他現在收到回程訊號 while GPIO.input(ECHO) == 1: pulse_end = time.time() # 我們將收到的起始跟結束相減就可以獲得他的時間 pulse_duration = pulse_end - pulse_start distance = pulse_duration * 17150 # 乘以聲速(34300 cm/s) # 然後因為來回所以要除2 distance = round(distance, 1) # 四捨五入到小數點後一位 return distance while True: try: distance = measure_distance() print('Distance:', distance, 'cm') time.sleep(1) if(distance<30): GPIO.output(11,True) voice.ChangeFrequency(523) time.sleep(1) elif(30<=distance<100): GPIO.output(11,True) voice.ChangeFrequency(523) time.sleep(0.5) GPIO.output(11,False) voice.ChangeFrequency(523) time.sleep(0.5) else: GPIO.output(11,False) except KeyboardInterrupt: break GPIO.cleanup ```