第1步:材料:
1 Raspberry Pi 3;
1 Arduino Mega 2560;
1個帶10個繼電器12 V的繼電器護罩;
10盞白熾燈127 V;
1個測力計自行車;
1電機(發電機)12 V;
電阻器(1x1kΩ,2x10kΩ);
1電解電容10μF;
1.5毫米電纜(紅色,黑色,棕色);
1支持10盞燈的MDF塔。
步驟2:系統框圖:
步驟3:系統操作:
該系統基于電動自行車騎行時產生的動能的轉換,該電能負責啟動將打開燈的繼電器。
發生器產生的電壓由Arduino的模擬引腳讀取,并通過RX-TX發送到Raspberry Pi。繼電器的激活與產生的電壓成正比 - 電壓越高,觸發的繼電器就越多,燈就會點亮。
步驟4:力學方面
為了將直流發電機機械地連接到自行車上,皮帶系統必須由普通自行車上使用的系統(由表冠,鏈條和小齒輪組成)代替。將金屬板焊接到自行車車架上,以便可以通過螺釘固定發動機。之后,將小齒輪焊接到發電機軸上,以便可以放置鏈條,將踏板系統與發電機互連。
步驟5:電壓讀數:
要使用Arduino讀取發電機的電壓,需要將電機的正極連接到控制器的A0引腳,將負極連接到GND - 以避免發電機的最大電壓大于在控制器和發生器之間構建了5 V的Arduino引腳,一個使用10μF電容的電壓濾波器,一個1kΩ的電阻和一個5.3 V的齊納二極管。 Arduino中加載的固件非常簡單,僅包括讀取模擬端口,將讀取的值乘以常數0.0048828125(5/1024,即Arduino的GPIO電壓除以其模擬端口的位數)并發送變量到串行 - 代碼將在文章中提供。
在Raspberry Pi中啟用RX-TX通信的過程有點復雜,您必須按照鏈接中描述的過程進行操作。簡而言之,您需要編輯名為“inittab”的文件 - 位于“/etc/inittab” - ,注釋行“T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100”(如果文件不是在Raspberry的操作系統中創建,您必須輸入命令:“sudo leafpad/boot/config.txt”并將“enable_uart = 1”行附加到文件末尾。完成此操作后,必須重新打開LX終端并使用命令“sudo systemctl stop serial-getty@ttyS0.service”和“sudo systemctl disable serial-getty@ttyS0.service”禁用Serial。之后你必須執行命令“sudo leafpad/boot/cmdline.txt”,刪除“console = serial0,115200”行,保存文件并重啟設備。為了能夠進行RX-TX通信,必須使用命令“sudo apt-get install -f python-serial”在Raspberry Pi上安裝串行庫,并通過插入“import serial”行將庫導入代碼中,通過插入行“ser = serial.Serial(”/dev/ttyS0“,9600)”來初始化串行,并使用命令“ser.readline()”讀取Arduino發送的電壓 - 使用的完整代碼Raspberry中的內容將在本文末尾提供。
按照上述步驟,讀取和發送電壓步驟完成。
步驟6:Arduino編程:
如前所述,負責讀取循環時產生的電壓的代碼非常簡單。
首先,有必要選擇A0引腳作為負責讀取電壓。
在“void setup()”功能中,需要通過“pinMode(sensor,INPUT)”命令將引腳A0設置為INPUT并選擇串口傳輸離子速度使用“Serial.begin(9600)”命令。
在“void loop()”中,“Serial.flush()”函數用于在每次終止發送時清除緩沖區信息通過串口;電壓讀數由“analogRead(sensor)”函數執行 - 記住有必要將模擬端口讀取的值轉換為Volts - 文章“讀取電壓”部分中引用的過程。
另外,在“void loop()”函數中,有必要將變量x從float轉換為string,因為這是通過RX-TX發送變量的唯一方法。循環函數的最后一步是在串行端口中打印字符串,以便將其發送到Raspberry - 為此,您必須使用“Serial.println(y)”函數。 “delay(100)”行僅添加到代碼中,以便以100 ms的間隔發送變量 - 如果不遵守此時間,將發生串行過載,從而在程序中生成可能的崩潰。
voltage_read.ino
float sensor = A0;
void setup (){
pinMode (sensor,INPUT);
Serial。 begin ( 9600 );
}
void loop (){
Serial。 flush ();
float x = analogRead (傳感器)* 0.0048828125 * 16.67 ;
字符串y = ” “ ;
y + = x;
Serial。 println (y);
delay ( 100 》;
}
查看由GitHub托管的rawvoltage_read.ino
第7步:Raspberry Pi 3編程:
lamps_bike.py
import os #導入操作系統庫(用于在必要時清除屏幕)
import RPi。 GPIO as gpio #導入庫用于控制Raspnerry的GPIO
導入串行 #導入庫負責串行通信
import 時間 #導入庫,可以使用延遲功能
導入子進程 #導入庫負責播放歌曲
# start serial
ser = serial.Serial( “/dev/ttyS0 “ , 9600 ) #定義設備名稱和波特率
# clear screen
clear = lambda :os.system( ‘ clear ’ )
#設置引腳用于繼電器控制
gpio.setmode(gpio。 BOARD )
gpio.setup( 11 ,gpio。 OUT ) #燈10
gpio .setup( 12 ,gpio。 OUT ) #指示燈9
gpio.setup( 13 ,gpio。 OUT ) #指示燈8
gpio.setup( 15 ,gpio。 OUT ) #燈7
gpio。設置( 16 ,gpio。 OUT ) #指示燈6
gpio.setup( 18 ,gpio。 OUT ) #指示燈5
gpio.setup ( 19 ,gpio。 OUT ) #指示燈4
gpio.setup( 21 ,gpio。 OUT ) #燈3
gpio.setup( 22 ,gpio。 OUT ) #指示燈2
gpio.setup( 23 ,gpio。 OUT ) #燈1
#開始記錄
name = [ “無”] * 10
電壓 = [ 0.00 ] * 10
#讀取記錄文件
f = 打開( ‘記錄’ , ‘ r ’ )
i 范圍( 10 ): #列表中出現10個最佳分數
name [i] = f.readline()
name [i] = name [i] [: len (name [i]) - 1 ]
voltage [ i] = f.readline()
電壓[i] = 浮動(電壓[i] [: len (電壓[i]) - 1 ])
f.close()
clear()
#設置最大電壓
max = 50.00
#關燈
for i in 范圍( 11 , 24 , 1 ):
if i != 14 和 i != 17 和 i != 20 :
gpio.output(i,gpio。 HIGH ) #設置為HIGH,繼電器關閉
# start
while True :
#初始屏幕
print ”記錄: n “
i 范圍( 10 ):
print name [i] , “:” ,電壓[I], “ V ”
current_name = raw_input ( “將您的名字寫下來開始:” )
clear()
#更改最大值
if current_name == “ max ” :
max = 輸入( ”寫下最大電壓:( 2位小數)“ )
clear()
else :
#啟動警告
for i in 范圍( 11 , 24 , 1 ): #循環在PIN 11中啟動并在PIN 24中停止
if i != 14 和 i != 17 和 i != 20 : # PIN 14和20是GND引腳,20是3.3 V引腳
gpio.output(i, gpio。低) #打開燈
time.sleep( 0.5 )
k = 10
for i in 范圍( 23 , 10 , - 1 ):
clear()
if i != 14 和 i != 17 和 i != 20 :
subprocess.Popen ([ 的 aplay 的 , 的音像/的 + STR (k)的 + 的的.wav 的 ])
時間。睡眠( 0.03 )
clear()
打印 “準備《!跨度》 n ” ,k
時間。睡眠( 1 )
k - = 1
gpio.output(i,gpio。 HIGH ) #關燈(逐個)
subprocess.Popen( [ 的 aplay 的 , 的音像/go.wav 的 ]) #播放開始音樂
time.sleep( 0.03 )
clear()
打印 ” GO!“
time.sleep( 1 )
clear()
#電壓讀數
current_voltage = 0.00
voltage1 = 0.00
i 范圍( 200 ):
ser.flushInput()
previous = voltage1
voltage1 = float (ser.readline()) #收集由RX-TX傳輸的Arduino數據
clear()
打印 voltage1, ” V “
if voltage1 》 current_voltage:
current_voltage = voltage1
#取決于產生的電壓,更多燈點亮。
如果 voltage1 《 max / 10 :
for i 范圍( 11 , 24 , 1 ):
if i != 14 和 i != 17 和 i != 20 :
gpio.output(i,gpio。 HIGH )
如果 voltage1 》 = max / 10 :
gpio.output( 11 ,gpio。 LOW )
i 范圍( 12 , 24 , 1 ):
if i != 14 和 i != 17 和 i != 20 :
gpio.output(i,gpio。 HIGH )
if voltage1 》 = 2 * 最大 / 10 :
《 范圍( 11 , 13 , 1 ):
gpio。輸出(i,gpio。低)
for i 范圍( 13 , 24 , 1 ):
如果 i != 14 和 i != 17 和 i != 20 :
gpio.output(i,gpio。 HIGH )
如果 voltage1 》 = 3 * max / 10 :
i 范圍( 11 , 14 , 1 ):
gpio.output(i,gpio。 LOW )
i 范圍( 15 , 24 , 1 ):
如果 i != 17 和 i != 20 :
gpio.output(i,gpio。 HIGH )
if voltage1 》 = 4 * max / 10 :
for i in 范圍 ( 11 , 16 , 1 ):
if i != 14 :
gpio.output(i,gpio。 LOW )
for i 范圍( 16 , 24 , 1 ):
if i != 17 和 i != 20 :
gpio.output(i,gpio。 HIGH )
if voltage1 》 = 5 * max / 10 :
范圍 span》 11 , 17 , 1 ):
如果 i != 14 :
gpio.output(i,gpio。 LOW )
for i 范圍( 18 , 24 , 1 ):
如果 i != 20 :
gpio.output(i,gpio。 HIGH )
如果 voltage1 》 = 6 * max / 10 :
for i 范圍( 11 , 19 , 1 ):
if i != 14 和 i != 17 :
gpio.output(i,gpio。 LOW )
i 范圍( 19 , 24 , 1 ):
如果 i != 20 :
gpio.output(i,gpio。 HIGH )
if voltage1 》 = 7 * 最大 / 10 :
for i in 范圍( 11 , 20 , 1 ):
if i != 14 和 i != 17 :
責任編輯:wv
-
繼電器
+關注
關注
132文章
5334瀏覽量
148867 -
電機
+關注
關注
142文章
9015瀏覽量
145440 -
Arduino
+關注
關注
188文章
6469瀏覽量
187015
發布評論請先 登錄
相關推薦
評論