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