สารบัญ:

การสร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer: 9 ขั้นตอน (พร้อมรูปภาพ)
การสร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer: 9 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: การสร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer: 9 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: การสร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer: 9 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: VO2 Max Test :วิ่งทดสอบเพื่อวัดค่าวีโอทูแมกซ์แบบละเอียดที่ M Life+เม้าท์มอยกับพี่เขาทรายสายสปริ๊นท์ 2024, กรกฎาคม
Anonim
สร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer
สร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer
สร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer
สร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer
สร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer
สร้างแรงดันไฟฟ้าด้วยจักรยาน Ergometer

รายละเอียดเพิ่มเติมของโครงการประกอบด้วยการประกอบ "เกม" โดยมีวัตถุประสงค์เพื่อเหยียบจักรยานยนต์ที่มีเครื่องวัดความเร็วลมที่เชื่อมต่อกับเครื่องกำเนิดไฟฟ้าและโคมไฟที่เปิดใช้งานเมื่อความเร็วรอบเครื่องยนต์เพิ่มขึ้น ซึ่งเกิดขึ้นจากการปั่นด้วยจักรยาน ระบบนี้ใช้การอ่านผ่านพอร์ตแอนะล็อกของ Arduino Mega ซึ่งสร้างแรงดันไฟฟ้าทันที จากนั้นส่งข้อมูลนี้ไปยัง Raspberry Pi 3 ผ่านการสื่อสารแบบอนุกรม RX-TX และการเปิดใช้งานหลอดไฟผ่านรีเลย์ในเวลาต่อมา

ขั้นตอนที่ 1: วัสดุ:

  • 1 ราสเบอร์รี่ Pi 3;
  • 1 Arduino เมกะ 2560;
  • 1 รีเลย์ชิลด์พร้อม 10 รีเลย์ 12 V;
  • 10 หลอดไส้ 127 V;
  • 1 จักรยาน Ergometer;
  • 1 เครื่องใช้ไฟฟ้า (Generator) 12 V;
  • ตัวต้านทาน (1x1kΩ, 2x10kΩ);
  • 1 ตัวเก็บประจุด้วยไฟฟ้า 10 µF;
  • 1 ซีเนอร์ไดโอด 5.3 V;
  • สายเคเบิล 1.5 มม. (แดง ดำ น้ำตาล);
  • 1 หอ MDF พร้อมรองรับ 10 หลอด

ขั้นตอนที่ 2: ไดอะแกรมบล็อกระบบ:

ไดอะแกรมบล็อกระบบ
ไดอะแกรมบล็อกระบบ

ขั้นตอนที่ 3: การทำงานของระบบ:

ระบบนี้อิงตามการเปลี่ยนแปลงของพลังงานจลน์ที่เกิดขึ้นเมื่อขี่จักรยานเป็นพลังงานไฟฟ้าซึ่งมีหน้าที่ในการสั่งงานรีเลย์ที่จะเปิดไฟ

แรงดันไฟฟ้าที่สร้างโดยเครื่องกำเนิดไฟฟ้านั้นอ่านโดยพินอะนาล็อกของ Arduino และส่งผ่าน RX-TX ไปยัง Raspberry Pi การเปิดใช้งานรีเลย์เป็นสัดส่วนกับแรงดันไฟฟ้าที่สร้างขึ้น - ยิ่งแรงดันไฟฟ้าสูงขึ้น รีเลย์ก็จะยิ่งทำงานมากขึ้นและหลอดไฟจะสว่างขึ้น

ขั้นตอนที่ 4: ด้านกลศาสตร์

ด้านกลศาสตร์
ด้านกลศาสตร์

ในการเชื่อมต่อเครื่องกำเนิดไฟฟ้ากระแสตรงเข้ากับจักรยานด้วยกลไก ระบบสายพานต้องถูกแทนที่ด้วยระบบที่ใช้กับจักรยานทั่วไป (ประกอบด้วยเม็ดมะยม โซ่ และเฟือง) แผ่นโลหะเชื่อมเข้ากับโครงจักรยานเพื่อให้ยึดเครื่องยนต์ด้วยสกรู หลังจากนั้นปีกนกถูกเชื่อมเข้ากับเพลาเครื่องกำเนิดไฟฟ้าเพื่อให้สามารถวางโซ่ได้โดยเชื่อมต่อระบบเหยียบกับเครื่องกำเนิดไฟฟ้า

ขั้นตอนที่ 5: การอ่านแรงดันไฟฟ้า:

ในการอ่านแรงดันไฟฟ้าของเครื่องกำเนิดไฟฟ้าโดยใช้ Arduino จำเป็นต้องเชื่อมต่อขั้วบวกของเครื่องไฟฟ้ากับพิน A0 ของคอนโทรลเลอร์และขั้วลบกับ GND เพื่อหลีกเลี่ยงไม่ให้แรงดันไฟฟ้าสูงสุดของเครื่องกำเนิดไฟฟ้ามากกว่า 5 V ของ พิน Arduino, ตัวกรองแรงดันไฟที่ใช้ตัวเก็บประจุ 10 µF, ตัวต้านทาน 1 kΩ และไดโอดซีเนอร์ 5.3 V ถูกสร้างขึ้นและเชื่อมต่อระหว่างคอนโทรลเลอร์กับเครื่องกำเนิดไฟฟ้า เฟิร์มแวร์ที่โหลดใน Arduino นั้นง่ายมากและประกอบด้วยการอ่านพอร์ตอะนาล็อกเท่านั้น คูณค่าที่อ่านด้วยค่าคงที่ 0.0048828125 (5/1024 นั่นคือแรงดันไฟฟ้า GPIO ของ Arduino หารด้วยจำนวนบิตของพอร์ตอะนาล็อก) และส่ง ตัวแปรเป็น Serial – รหัสจะมีอยู่ในบทความ

ขั้นตอนการเปิดใช้งานการสื่อสาร RX-TX ใน Raspberry Pi นั้นซับซ้อนกว่าเล็กน้อย และคุณต้องทำตามขั้นตอนที่อธิบายไว้ในลิงก์ โดยสังเขป คุณต้องแก้ไขไฟล์ชื่อ “inittab” – ซึ่งอยู่ใน “/etc/inittab” – แสดงความคิดเห็นในบรรทัด “T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100” (หากไฟล์นั้นไม่ใช่ ก่อตั้งขึ้นในระบบปฏิบัติการของ Raspberry คุณต้องป้อนคำสั่ง: “sudo leafpad /boot/config.txt” และต่อท้ายบรรทัด “enable_uart=1” ต่อท้ายไฟล์) เมื่อเสร็จแล้ว คุณต้องเปิด LX Terminal อีกครั้งและปิดใช้งาน Serial ด้วยคำสั่ง "sudo systemctl stop [email protected]" และ "sudo systemctl disable [email protected]" หลังจากนั้นคุณต้องรันคำสั่ง "sudo leafpad /boot/cmdline.txt" ให้ลบบรรทัด "console = serial0, 115200" บันทึกไฟล์และรีสตาร์ทอุปกรณ์ เพื่อให้การสื่อสาร RX-TX เป็นไปได้ ต้องติดตั้งไลบรารีอนุกรมบน Raspberry Pi ด้วยคำสั่ง "sudo apt-get install -f python-serial" และนำเข้าไลบรารีลงในโค้ดโดยแทรกบรรทัด "import serial", เริ่มต้นอนุกรมโดยใส่บรรทัด "ser = serial. Serial (" / dev / ttyS0 ", 9600)" และอ่านค่าแรงดันไฟฟ้าที่ส่งโดย Arduino โดยใช้คำสั่ง “ser.readline()” – รหัสเต็มที่ใช้ ใน Raspberry จะวางจำหน่ายในตอนท้ายของบทความ

ตามขั้นตอนที่อธิบายไว้ข้างต้น ขั้นตอนการอ่านและส่งแรงดันไฟฟ้าจะเสร็จสมบูรณ์

ขั้นตอนที่ 6: การเขียนโปรแกรม Arduino:

ตามที่ระบุไว้ก่อนหน้านี้ รหัสที่รับผิดชอบในการอ่านแรงดันไฟฟ้าที่สร้างขึ้นเมื่อปั่นจักรยานนั้นง่ายมาก

ประการแรก จำเป็นต้องเลือกพิน A0 เป็นตัวอ่านแรงดันไฟฟ้า

ในฟังก์ชัน "การตั้งค่าเป็นโมฆะ ()" คุณต้องตั้งค่าพิน A0 เป็น INPUT ด้วยคำสั่ง "pinMode(เซ็นเซอร์, INPUT)" และเลือกความเร็วในการส่งพอร์ตอนุกรมโดยใช้คำสั่ง "Serial.begin(9600)"

ใน "void loop ()" ฟังก์ชัน "Serial.flush ()" ถูกใช้เพื่อล้างบัฟเฟอร์ทุกครั้งที่ยุติการส่งข้อมูลผ่านซีเรียล การอ่านค่าแรงดันไฟฟ้าดำเนินการโดยฟังก์ชัน "analogRead (เซ็นเซอร์)" – จำไว้ว่าจำเป็นต้องแปลงค่าที่อ่านโดยพอร์ตอะนาล็อกเป็นโวลต์ – กระบวนการที่อ้างถึงในส่วน "แรงดันการอ่าน" ของบทความ

นอกจากนี้ ในฟังก์ชัน "void loop ()" จำเป็นต้องแปลงตัวแปร x จาก float เป็น string เนื่องจากเป็นวิธีเดียวในการส่งตัวแปรผ่าน RX-TX ขั้นตอนสุดท้ายในฟังก์ชันวนรอบคือการพิมพ์สตริงในพอร์ตอนุกรมเพื่อให้สามารถส่งไปยัง Raspberry - สำหรับสิ่งนี้ คุณต้องใช้ฟังก์ชัน "Serial.println (y)" มีการเพิ่มบรรทัด "delay (100)" ลงในโค้ดเท่านั้นเพื่อให้ส่งตัวแปรในช่วงเวลา 100 มิลลิวินาที - หากไม่ปฏิบัติตามเวลานี้ Serial overload จะเกิดขึ้นทำให้เกิดการขัดข้องในโปรแกรม

voltage_read.ino

เซ็นเซอร์ลอย = A0;
voidsetup() {
pinMode(เซ็นเซอร์, INPUT);
Serial.begin(9600);
}
โมฆะลูป () {
Serial.flush();
float x=analogRead(เซ็นเซอร์)*0.0048828125*16.67;
สตริง y="";
y+=x;
Serial.println(y);
ล่าช้า (100);
}

ดู rawvoltage_read.ino โฮสต์ด้วย ❤ โดย GitHub

ขั้นตอนที่ 7: การเขียนโปรแกรม Raspberry Pi 3:

lamps_bike.py

import os #import the os library (ใช้เพื่อล้างหน้าจอเมื่อจำเป็น)
นำเข้า RPi. GPIOas gpio #import ไลบรารีที่ใช้ในการควบคุม GPIO. ของ Raspnerry
นำเข้าไลบรารีซีเรียล #import ที่รับผิดชอบด้านการสื่อสารแบบอนุกรม
เวลานำเข้า #นำเข้าห้องสมุด ที่ทำให้สามารถใช้ฟังก์ชั่นการหน่วงเวลาได้
นำเข้ากระบวนการย่อย #นำเข้าไลบรารีที่รับผิดชอบในการเล่นเพลง
#เริ่มซีรี่ย์
ser = serial. Serial("/dev/ttyS0", 9600) #define ชื่ออุปกรณ์และอัตราบอด
#หน้าจอใส
clear = lambda: os.system('ชัดเจน')
#เซ็ตพินสำหรับคอนโทรลรีเลย์
gpio.setmode(gpio.บอร์ด)
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.setup(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 =open('บันทึก', 'r')
สำหรับ i inrange(10): #the 10 คะแนนที่ดีที่สุดปรากฏบนรายการ
ชื่อ=f.readline()
ชื่อ=ชื่อ[:len(ชื่อ)-1]
แรงดันไฟฟ้า=f.readline()
แรงดันไฟฟ้า=ลอย(แรงดันไฟฟ้า[:len(แรงดันไฟฟ้า)-1])
f.close()
แจ่มใส()
#ตั้งค่าแรงดันไฟสูงสุด
สูงสุด=50.00
#ปิดไฟ
สำหรับฉันอยู่ในช่วง (11, 24, 1):
ถ้า i!=14and i!=17and i!=20:
gpio.output(i, gpio. HIGH) #set to HIGH รีเลย์จะปิด
#เริ่ม
ในขณะที่จริง:
#หน้าจอเริ่มต้น
พิมพ์"บันทึก:\n"
สำหรับฉันอยู่ในช่วง(10):
พิมพ์ชื่อ, ":", แรงดันไฟฟ้า, "V"
current_name=raw_input("เขียนชื่อของคุณเพื่อเริ่มต้น: ")
แจ่มใส()
#เปลี่ยนค่าสูงสุด
ถ้า current_name =="max":
max=input("เขียนแรงดันสูงสุด: (ทศนิยม 2 ตำแหน่ง)")
แจ่มใส()
อื่น:
#เริ่มเตือน
สำหรับฉันอยู่ในช่วง (11, 24, 1): # การวนซ้ำเริ่มต้นใน PIN 11 และหยุดใน PIN 24
if i!=14and i!=17and i!=20: #PIN 14 and 20 เป็นพิน GND และ 20 เป็นพิน 3.3 V
gpio.output(i, gpio. LOW) #เปิดหลอดไฟ
เวลานอน(0.5)
k=10
สำหรับฉันอยู่ในช่วง (23, 10, -1):
แจ่มใส()
ถ้า i!=14and i!=17and i!=20:
subprocess. Popen(['aplay', 'Audios/'+str(k)+'.wav'])
เวลานอน(0.03)
แจ่มใส()
print"Prepare!\n", k
เวลานอน(1)
k-=1
gpio.output(i, gpio. HIGH) #ปิดไฟ (ทีละดวง)
subprocess. Popen(['aplay', 'Audios/go.wav']) #เล่นเพลงเริ่มต้น
เวลานอน(0.03)
แจ่มใส()
พิมพ์ "ไป!"
เวลานอน(1)
แจ่มใส()
#อ่านค่าแรงดัน
current_voltage=0.00
แรงดันไฟ 1=0.00
สำหรับฉันอยู่ในช่วง (200):
ser.flushInput()
ก่อนหน้า=แรงดันไฟฟ้า1
voltage1=float(ser.readline()) #collects ข้อมูลของ Arduino ที่ถ่ายโอนโดย RX-TX
แจ่มใส()
แรงดันการพิมพ์1, "V"
ถ้าVoltage1>current_voltage:
current_voltage=voltage1
# ขึ้นอยู่กับแรงดันไฟฟ้าที่สร้างขึ้น หลอดไฟจะสว่างขึ้น
ถ้า voltage1<max/10:
สำหรับฉันอยู่ในช่วง (11, 24, 1):
ถ้า i!=14and i!=17and i!=20:
gpio.output(i, gpio. HIGH)
ถ้า voltage1>=max/10:
gpio.output(11, gpio. LOW)
สำหรับฉันอยู่ในช่วง (12, 24, 1):
ถ้า i!=14and i!=17and i!=20:
gpio.output(i, gpio. HIGH)
ถ้า voltage1>=2*max/10:
สำหรับฉันอยู่ในช่วง (11, 13, 1):
gpio.output(i, gpio. LOW)
สำหรับฉันอยู่ในช่วง (13, 24, 1):
ถ้า i!=14and i!=17and i!=20:
gpio.output(i, gpio. HIGH)
ถ้า voltage1>=3*max/10:
สำหรับฉันอยู่ในช่วง (11, 14, 1):
gpio.output(i, gpio. LOW)
สำหรับฉันอยู่ในช่วง (15, 24, 1):
ถ้าฉัน!=17และ ฉัน!=20:
gpio.output(i, gpio. HIGH)
ถ้า voltage1>=4*max/10:
สำหรับฉันอยู่ในช่วง (11, 16, 1):
ถ้าฉัน!=14:
gpio.output(i, gpio. LOW)
สำหรับฉันอยู่ในช่วง (16, 24, 1):
ถ้าฉัน!=17และ ฉัน!=20:
gpio.output(i, gpio. HIGH)
ถ้า voltage1>=5*max/10:
สำหรับฉันอยู่ในช่วง (11, 17, 1):
ถ้าฉัน!=14:
gpio.output(i, gpio. LOW)
สำหรับฉันอยู่ในช่วง (18, 24, 1):
ถ้าฉัน!=20:
gpio.output(i, gpio. HIGH)
ถ้า voltage1>=6*max/10:
สำหรับฉันอยู่ในช่วง (11, 19, 1):
ถ้าฉัน!=14และ ฉัน!=17:
gpio.output(i, gpio. LOW)
สำหรับฉันอยู่ในช่วง(19, 24, 1):
ถ้าฉัน!=20:
gpio.output(i, gpio. HIGH)
ถ้า voltage1>=7*max/10:
สำหรับฉันอยู่ในช่วง (11, 20, 1):
ถ้าฉัน!=14และ ฉัน!=17:
gpio.output(i, gpio. LOW)
สำหรับฉันอยู่ในช่วง (21, 24, 1):
gpio.output(i, gpio. HIGH)
ถ้า voltage1>=8*max/10:
สำหรับฉันอยู่ในช่วง (11, 22, 1):
ถ้า i!=14and i!=17and i!=20:
gpio.output(i, gpio. LOW)
สำหรับฉันอยู่ในช่วง (22, 24, 1):
gpio.output(i, gpio. HIGH)
ถ้า voltage1>=9*max/10:
สำหรับฉันอยู่ในช่วง (11, 23, 1):
ถ้า i!=14and i!=17and i!=20:
gpio.output(i, gpio. LOW)
gpio.output(23, gpio.สูง)
ถ้า voltage1>=max:
สำหรับฉันอยู่ในช่วง (11, 24, 1):
ถ้า i!=14and i!=17and i!=20:
gpio.output(i, gpio. LOW)
ถ้าแรงดันไฟฟ้า1
หยุดพัก
#ปิดไฟ
สำหรับฉันอยู่ในช่วง (11, 24, 1):
ถ้า i!=14and i!=17and i!=20:
gpio.output(i, gpio. HIGH)
#เพลงแห่งชัยชนะ
ถ้า current_voltage>=max:
subprocess. Popen(['aplay', 'Audios/rocky.wav'])
เวลานอน(0.03)
แจ่มใส()
print"ดีมาก คุณชนะ!"% (u'\u00c9', u'\u00ca', u'\u00c2')
สำหรับฉันอยู่ในช่วง(10):
สำหรับ j inrange (11, 24, 1):
ถ้า j!=14and j!=17and j!=20:
gpio.output(j, gpio. LOW)
เวลานอน (0.05)
สำหรับ j inrange (11, 24, 1):
ถ้า j!=14and j!=17and j!=20:
gpio.output(j, gpio. HIGH)
เวลานอน (0.05)
เวลานอน(0.5)
subprocess. Popen(['aplay', 'Audios/end.wav'])
เวลานอน(0.03)
แจ่มใส()
พิมพ์"จบเกม…\n", current_voltage, "V"
#บันทึก
เวลานอน(1.2)
ถึง=0
สำหรับฉันอยู่ในช่วง(10):
ถ้า current_voltage > แรงดันไฟฟ้า:
ถึง+1
temp_voltage=แรงดันไฟฟ้า
แรงดันไฟฟ้า=current_voltage
current_voltage=temp_voltage
temp_name=name
ชื่อ=current_name
current_name=temp_name
ถ้าถึง >0:
subprocess. Popen(['aplay', 'Audios/record.wav'])
เวลานอน(0.03)
แจ่มใส()
f =open('บันทึก', 'w')
สำหรับฉันอยู่ในช่วง(10):
f.write(ชื่อ)
f.write("\n")
f.write(str(แรงดันไฟฟ้า))
f.write("\n")
f.close()
แจ่มใส()

ดู rawlamps_bike.py โฮสต์ด้วย ❤ โดย GitHub

ขั้นตอนที่ 8: โครงการไฟฟ้า:

โครงการไฟฟ้า
โครงการไฟฟ้า
โครงการไฟฟ้า
โครงการไฟฟ้า
โครงการไฟฟ้า
โครงการไฟฟ้า

Arduino และ Raspberry Pi 3 ใช้พลังงานจากแหล่งจ่าย 5V ที่มีกระแสไฟ 3A

วงจรไฟฟ้าเริ่มต้นด้วยการเชื่อมต่อเครื่องกำเนิดไฟฟ้ากระแสตรง (ควบคู่ไปกับจักรยาน) กับ Arduino ผ่านตัวกรองแรงดันไฟที่ประกอบด้วยไดโอดซีเนอร์ 5.3V ตัวเก็บประจุ 10μF และตัวต้านทาน 1kΩ - อินพุตตัวกรองเชื่อมต่อกับ ขั้วต่อเครื่องกำเนิดไฟฟ้าและเอาต์พุตเชื่อมต่อกับพอร์ต A0 และ GND ของคอนโทรลเลอร์

Arduino เชื่อมต่อกับ Raspberry ผ่านการสื่อสาร RX-TX - ดำเนินการผ่านตัวแบ่งตัวต้านทานโดยใช้ตัวต้านทาน10kΩ (จำเป็นโดยพอร์ตของคอนโทรลเลอร์ที่ทำงานที่แรงดันไฟฟ้าต่างกัน)

GPIO ของ Raspberry Pi เชื่อมต่อกับรีเลย์ที่รับผิดชอบในการเปิดหลอดไฟ "COM" ของรีเลย์ทั้งหมดเชื่อมต่อถึงกันและเชื่อมต่อกับเฟส (กริดไฟฟ้ากระแสสลับ) และ "N. O" (ปกติเปิด) ของรีเลย์แต่ละตัวเชื่อมต่อกับหลอดไฟแต่ละดวง และความเป็นกลางของกริดไฟฟ้ากระแสสลับเชื่อมต่อกับหลอดไฟทั้งหมด ดังนั้น เมื่อ GPIO ที่รับผิดชอบสำหรับรีเลย์แต่ละตัวถูกเปิดใช้งาน รีเลย์จะเปลี่ยนเป็นเฟสของเครือข่าย AC และเปิดหลอดไฟที่เกี่ยวข้อง

ขั้นตอนที่ 9: ผลลัพธ์:

Image
Image

หลังจากการประกอบขั้นสุดท้ายของโครงการ ได้รับการตรวจสอบแล้วว่าทำงานได้ตามที่คาดไว้ – ตามความเร็วที่ผู้ใช้เหยียบจักรยาน แรงดันไฟฟ้าถูกสร้างขึ้นและไฟส่องสว่างมากขึ้น

แนะนำ: