สารบัญ:
- ขั้นตอนที่ 1: วัสดุและเครื่องมือ
- ขั้นตอนที่ 2: การประกอบวงจร
- ขั้นตอนที่ 3: กะพริบ MCU
- ขั้นตอนที่ 4: การประกอบปลอกวงจร
- ขั้นตอนที่ 5: เชื่อมต่อ Rig Leads เข้ากับคอนโทรลเลอร์
- ขั้นตอนที่ 6: ทดสอบคอนโทรลเลอร์
- ขั้นตอนที่ 7: การกำหนดค่าผ่าน I2C โดยใช้คอนโซล Input
- ขั้นตอนที่ 8: ขั้นตอนถัดไป
วีดีโอ: IOT123 - SOLAR TRACKER - ตัวควบคุม: 8 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:07
นี่คือส่วนขยายของ Instructable
IOT123 - ตัวติดตามพลังงานแสงอาทิตย์ - TILT/PAN, PANEL FRAME, LDR MOUNTS RIG ที่นี่เราเน้นที่ตัวควบคุมเซอร์โวและเซ็นเซอร์ตำแหน่งของดวงอาทิตย์ สิ่งสำคัญคือต้องชี้ให้เห็นว่าการออกแบบนี้สันนิษฐานว่าจะใช้ MCU 2 ตัว: หนึ่งตัว (3.3V 8mHz Arduino Pro Mini) สำหรับตัวติดตามแสงอาทิตย์ และ MCU อิสระหนึ่งตัวสำหรับเซ็นเซอร์/นักแสดงของคุณ
นี่คือเวอร์ชัน 0.3
แทนที่จะเผยแพร่โครงการทั้งหมดหลังจากพึงพอใจอย่างสมบูรณ์แล้ว ฉันจะฝึกการบูรณาการอย่างต่อเนื่องและนำเสนอบางสิ่งบ่อยขึ้น โดยปรับเปลี่ยนสิ่งที่ฉันได้ส่งมอบตามที่ฉันต้องการ ฉันจะเขียนคำแนะนำอื่นสำหรับการชาร์จแบตเตอรี่ _เมื่อ_ การปรับให้เหมาะสมของซอฟต์แวร์ / ฮาร์ดแวร์คอนโทรลเลอร์เสร็จสมบูรณ์ ฉันจะชี้ให้เห็นว่าจำเป็นต้องมีการเพิ่มประสิทธิภาพที่ไหนเมื่อเราทำตามขั้นตอนนี้
เหตุผลส่วนหนึ่งสำหรับแนวทางนี้คือความคิดเห็นของลูกค้า หากพวกคุณเห็นความต้องการหรือมีแนวทางที่ดีกว่า โปรดแสดงความคิดเห็น แต่จำไว้ว่า ฉันไม่สามารถส่งมอบทุกอย่างได้และอาจไม่ใช่กรอบเวลาที่เหมาะสมกับคุณ เนื่องจากคำอธิบายเหล่านี้ดูมีความเกี่ยวข้องน้อยกว่า จึงจะถูกลบออกจากบทความนี้
สิ่งนี้รวมถึง:
- ใช้ LDR จาก Instructable ดั้งเดิมเพื่อสัมผัสตำแหน่งโดยประมาณของดวงอาทิตย์
- ย้ายเซอร์โวให้หันหน้าเข้าหาดวงอาทิตย์
- ตัวเลือกสำหรับความไวของการเคลื่อนไหว
- ตัวเลือกสำหรับขนาดขั้นบันไดเมื่อเคลื่อนเข้าหาดวงอาทิตย์
- ตัวเลือกสำหรับข้อจำกัดเชิงมุมที่ใช้กับเซอร์โว
- ตัวเลือกสำหรับความล่าช้าของการเคลื่อนไหว
- อินเทอร์เฟซ I2C สำหรับการตั้งค่า/รับค่าระหว่าง MCU
- หลับลึกระหว่างการเคลื่อนไหว
สิ่งนี้ไม่รวมถึง (และจะได้รับการแก้ไขตามเวลาอนุญาต):
- ใช้พลังงานในช่วงเวลากลางวันเท่านั้น
- จำตำแหน่งรุ่งอรุณและไปที่นั่นตอนพลบค่ำ
- การถอดตัวควบคุมออกจาก MCU
- ปิดการใช้งาน LED บน MCU
- เปลี่ยนเส้นทางพลังงานผ่าน VCC แทนที่จะเป็น RAW
- ให้วิธีแก้ไขปัญหาชั่วคราวสำหรับการกะพริบโดยไม่มีไฟควบคุมจากตัวแปลง USB เป็น Serial TTL
- ตัวตรวจสอบแรงดันแบตเตอรี่
ประวัติศาสตร์
20 ธ.ค. 2017 V0.1 CODE
เวอร์ชันเริ่มต้นติดตามแหล่งกำเนิดแสง เปิดตลอดเวลา ไม่ต้องชาร์จ
7 ม.ค. 2018 รหัส V0.2
-
การเปลี่ยนแปลงฮาร์ดแวร์
- เพิ่มหมุด I2C
- เพิ่มสวิตช์ไปที่เซอร์โว GNDs
- พิมพ์ฉลากบนแผงกล่องควบคุม
-
การเปลี่ยนแปลงซอฟต์แวร์
- อ่านการกำหนดค่าจาก EEPROM
- รองรับบัส I2C เป็นทาสของ MCU อื่น (3.3V)
- ตั้งค่าคอนฟิกผ่าน I2C
- ตั้งค่าเปิดใช้งานผ่าน I2C
- รับการกำหนดค่าผ่าน I2C
- รับคุณสมบัติรันไทม์ผ่าน I2C (เปิดใช้งานอยู่และความเข้มของแสงปัจจุบัน)
- ลบการบันทึกแบบอนุกรม (ส่งผลต่อค่า I2C)
19 ม.ค. 2018 V0.3 CODE
-
ฮาร์ดแวร์
อัปเดตป้ายกำกับแล้ว ตอนนี้ใช้สวิตช์เพื่อเลือกโหมด CONFIG หรือ TRACK
-
ซอฟต์แวร์
- I2C ใช้สำหรับการกำหนดค่าเท่านั้น
- ตัวควบคุมรอ 5 วินาทีก่อนที่จะเริ่มต้นการติดตาม อนุญาตให้ขยับมือ
- ในการใช้การกำหนดค่า I2C SPDT ต้องอยู่ใน CONFIG เป็นยูนิตบูต
- ระหว่างการติดตามการเคลื่อนไหว หน่วยจะอยู่ในโหมดหลับลึกสำหรับค่าการกำหนดค่า SLEEP MINUTES (ค่าเริ่มต้น 20 นาที)
ขั้นตอนที่ 1: วัสดุและเครื่องมือ
ขณะนี้มีรายการ Bill of Materials and Sources ฉบับเต็มแล้ว
- ชิ้นส่วนที่พิมพ์ 3 มิติ
- Arduino Pro Mini 3.3V 8mHz
- 1 จาก 4x6cm Double Side Prototype PCB Universal Printed Circuit Board (ตัดครึ่ง)
- 1 ออก 40P ส่วนหัวชาย (เพื่อตัดให้ได้ขนาด)
- 1 จากส่วนหัว 40P ตัวเมีย (เพื่อตัดให้ได้ขนาด)
- 4 ปิด 10K 1 / 4W รีสเตอร์
- สายต่อ.
- ประสานและเหล็ก
- สกรูเกลียวปล่อยหัวกระทะสแตนเลสขนาด 4G x 6 มม. 20 ตัว
- 4 ออก 4G x 6 มม. สแตนเลส countersunk สกรูต๊าปเกลียว
- 1 ปิด 3.7V LiPo แบตเตอรี่และที่ยึด (สิ้นสุดในขั้วต่อดูปองท์ 2P)
- 1 ปิดส่วนหัวมุมขวาชาย 2P
- 1 ปิดสวิตช์ SPDT 3 ขา 2.54 มม. pitch
- กาวไซยาโนอะคริเลตที่แข็งแกร่ง
- ขั้วต่อ Dupont ตัวเมีย 1P ส่วนหัว (1 ปิดสีน้ำเงิน 1 ปิดสีเขียว)
ขั้นตอนที่ 2: การประกอบวงจร
ปัจจุบันวงจรไม่มีวงจรแบ่งแรงดัน (volt meter)
- ตัดแผงวงจรพิมพ์สากล PCB ต้นแบบสองด้านขนาด 4x6 ซม. ครึ่งหนึ่งตามแกนยาว
-
ตัดส่วนหัวชาย 40P เป็นชิ้น ๆ:
- 2 ปิด 12P
- 3 ปิด 3P
- 6 ออก 2P
-
ตัดส่วนหัวเพศหญิง 40P เป็นชิ้น ๆ:
- 2 ปิด 12P
- 1 ออก 6P
- ประสาน 2 ปิด 12Pfemale ส่วนหัวตามที่แสดง
- กาวตัวเว้นวรรคที่นำออกจากส่วนหัว 3P ตัวผู้ (เพิ่มเติม) ที่ด้านล่างของสวิตช์ SPDT ด้วยกาวไซยาโนอะคริเลต
- ที่ด้านอื่น ๆ ให้บัดกรี 6 ปิด 2P, 2 ปิดส่วนหัว 3Pmale และสวิตช์ SPDT ตามที่แสดง
- บัดกรี 4 จากตัวต้านทาน 10K (A, B, C, D สีดำ) ผ่านตะกั่วไปยังส่วนหัวพิน GND (#2 สีดำ) และไปยังหมุดส่วนหัว A0 - A3 (#5, #6, #7, #8) จากนั้นผ่านรู (สีเหลือง) ตามที่แสดง (3 รูป + 1 แผนภาพ)
- ติดตาม 3.3V จาก LDR PINS บัดกรี PINS #4, #6, #8, #10 และเกลียวแม้ว่ารูถึงส่วนหัว feamale ขา VCC (สีเขียว)
- ติดตาม 3.3V ที่ด้านส่วนหัวของตัวเมียตามที่แสดง (สีแดง) บัดกรีที่ PINS #1, #12, #15
- 3.3V ผ่านรูที่บัดกรีด้านบน (สีแดง) PIN ส่วนหัว RAW #1
- ติดตามการเชื่อมต่อสีส้มจาก PIN #11 ผ่านรูเพื่อบัดกรีหมุดตัวเมียที่อีกด้านหนึ่งตามที่แสดง
- ติดตามและบัดกรีสายเชื่อมต่อสีน้ำเงินจาก #20 ถึง #30 และ #31 ถึง #13 และ #16
- PIN ส่วนหัวของตัวเมียบัดกรี #11 ถึง PIN ส่วนหัวของตัวผู้ #11 ผ่านรู
- เตรียมขั้วต่อดูปองท์ 2 ตัว ยาว 30 มม. พร้อมส่วนหัว 1P ตัวเมีย (สีน้ำเงิน 1 อัน และสีเขียว 1 อัน) แถบและดีบุกปลายอีกด้านหนึ่ง
- ลวดบัดกรีดูปองท์สีน้ำเงินถึง #28; บัดกรีลวดดูปองท์สีเขียวกับ #29
- ที่ด้านบนของ Arduino แก้ไขส่วนหัวของตัวเมีย 6P แล้วบัดกรี
- ที่ด้านบนของ Arduino แก้ไขส่วนหัวของตัวเมียมุมฉาก 2P int #29 และ #30 จากนั้นประสาน
- ที่ด้านล่างของ Arduino แก้ไขหมุดตัวผู้ 2 ตัวจาก 12P และ 1 จาก 3P จากนั้นบัดกรี
- ใส่หมุด 12P ตัวผู้ของ Arduino ลงในส่วนหัว PCB 12P ตัวเมีย
ขั้นตอนที่ 3: กะพริบ MCU
Arduino Pro Mini สามารถแฟลชได้อย่างสะดวกโดยใช้ตัวแปลง FTDI232 USB เป็น TTL โดยใช้ส่วนหัวของตัวเมีย 6P ดูภาพด้านบนสำหรับการจัดตำแหน่ง 2 บอร์ด
ตรวจสอบให้แน่ใจว่าได้เลือกการตั้งค่า 3.3V บน FTDI232 ของคุณ ทำตามคำแนะนำที่นี่โดยใช้รหัสด้านล่าง (ใช้ลิงก์ไปยัง GIST)
ต้องติดตั้งไลบรารีพลังงานต่ำ (แนบและ
เมื่อติดตั้ง Arduino Pro Mini + PCB ลงในเคสแล้ว ยังสามารถแฟลชได้เมื่อหมุดส่วนหัวถูกเปิดออก เพียงถอดคอนโทรลเลอร์ยูนิตออกจากแผงเฟรมโดยเปิดเผยส่วนหัว
ตัวติดตามแสงอาทิตย์แบบแพนเอียงพร้อมการกำหนดค่า I2C/EEPROM และวงจรการนอนหลับระหว่างการเคลื่อนไหว ความแม่นยำของระยะเวลาของรอบการนอนหลับลดลงเมื่อระยะเวลาเพิ่มขึ้น แต่เพียงพอสำหรับจุดประสงค์นี้
/* |
* แก้ไขจากรหัส |
* โดย Mathias Leroy |
* |
* การปรับเปลี่ยน V0.2 |
** I2C SET GET |
** ชุด EEPROM รับ |
** ลบ SERIAL OUTPUT - ได้รับผลกระทบ I2C |
** เปิด / ปิดการติดตาม |
** ย้ายเซิร์ฟเวอร์ไปยังขีดจำกัดผ่าน I2C |
** อ่านความเข้มเฉลี่ยปัจจุบันผ่าน I2C |
* V0.3 การปรับเปลี่ยน |
** สวิตช์สำหรับ 2 โหมด - ติดตาม (ไม่มี I2C) และกำหนดค่า (ใช้ I2C) |
** นอนหลับในโหมดติดตาม (ความแม่นยำต่ำมากเนื่องจากก้อนที่ 8 วินาที) |
** ถอด/แนบ SERVOS ขณะหลับ/ตื่น (ทรานซิสเตอร์ใช้ในที่สุด) |
** ลบตำแหน่งเริ่มต้นที่กำหนดค่าได้ (ซ้ำซ้อน) |
** ลบวินาทีที่กำหนดค่าได้ (ซ้ำซ้อน) |
** ลบการกำหนดค่าเปิดใช้งาน / ปิดการใช้งาน (ซ้ำซ้อน) |
** ลบตัวติดตามที่เปิดใช้งานได้ (ใช้สวิตช์ฮาร์ดแวร์) |
** ลบแรงดันไฟฟ้า GETTER - จะใช้ส่วนประกอบ I2C แยกต่างหาก |
** เพิ่มการบันทึกซีเรียลเมื่อไม่ใช้ I2C |
*/ |
#รวม |
#รวม |
#รวม |
#รวม |
#รวม |
#defineEEPROM_VERSION1 |
#defineI2C_MSG_IN_SIZE3 |
#definePIN_LDR_TL A0 |
#definePIN_LDR_TR A1 |
#definePIN_LDR_BR A3 |
#definePIN_LDR_BL A2 |
#definePIN_SERVO_V11 |
#definePIN_SERVO_H5 |
#defineIDX_I2C_ADDR0 |
#defineIDX_V_ANGLE_MIN1 |
#defineIDX_V_ANGLE_MAX2 |
#defineIDX_V_SENSITIVITY3 |
#defineIDX_V_STEP4 |
#defineIDX_H_ANGLE_MIN5 |
#defineIDX_H_ANGLE_MAX6 |
#defineIDX_H_SENSITIVITY7 |
#defineIDX_H_STEP8 |
#defineIDX_SLEEP_MINUTES9 |
#defineIDX_V_DAWN_ANGLE10 |
#defineIDX_H_DAWN_ANGLE11 |
#defineIDX_DAWN_INTENSITY12// ค่าเฉลี่ยของ LDRS. ทั้งหมด |
#defineIDX_DUSK_INTENSITY13// ค่าเฉลี่ยของ LDRS. ทั้งหมด |
#defineIDX_END_EEPROM_SET14 |
#defineIDX_CURRENT_INTENSITY15// ค่าเฉลี่ยของ LDRS ทั้งหมด - ใช้สำหรับคำนวณ IDX_DAWN_INTENSITY แสงแวดล้อมที่ไม่ใช่แสงตรง |
#defineIDX_END_VALUES_GET16 |
#defineIDX_SIGN_117 |
#defineIDX_SIGN_218 |
#defineIDX_SIGN_319 |
เซอร์โว _servoH; |
เซอร์โว _servoV; |
ไบต์ _i2cVals[20] = {10, 10, 170, 20, 5, 10, 170, 20, 5, 20, 40, 10, 30, 40, 0, 0, 0, 0, 0, 0}; |
int _servoLoopDelay = 10; |
int _slowingDelay=0; |
int _angleH = 90; |
int _angleV = 90; |
int _averageTop = 0; |
int _averageRight = 0; |
int _averageBottom = 0; |
int _averageLeft = 0; |
ไบต์ _i2cResponse = 0; |
bool _inConfigMode = เท็จ; |
voidsetup() |
{ |
Serial.begin(115200); |
getFromEeprom(); |
ถ้า (inConfigMode()){ |
Serial.println ("โหมดกำหนดค่า"); |
Serial.print("ที่อยู่ I2C: "); |
Serial.println(_i2cVals[IDX_I2C_ADDR]); |
Wire.begin(_i2cVals[IDX_I2C_ADDR]); |
Wire.onReceive(receiveEvent); |
Wire.onRequest (requestEvent); |
}อื่น{ |
Serial.println ("โหมดติดตาม"); |
ล่าช้า (5000); // ถึงเวลาที่จะปล่อยมือหากเชื่อมต่อแบตเตอรี่ ฯลฯ |
} |
} |
โมฆะลูป () |
{ |
getLightValues(); |
ถ้า (!_inConfigMode){ |
// สิ่งที่ต้องทำ: เปิดสวิตช์ทรานซิสเตอร์ |
_servoH.แนบ(PIN_SERVO_H); |
_servoV.แนบ(PIN_SERVO_V); |
สำหรับ (int i = 0; i < 20; i++){ |
ถ้า (i != 0){ |
getLightValues(); |
} |
moveServos(); |
} |
ล่าช้า (500); |
_servoH.detach(); |
_servoV.detach(); |
// สิ่งที่ต้องทำ: ปิดสวิตช์ทรานซิสเตอร์ |
ล่าช้า (500); |
sleepFor((_i2cVals[IDX_SLEEP_MINUTES] * 60) / 8); |
} |
} |
//-------------------------------- โหมดปัจจุบัน |
boolinConfigMode(){ |
โหมดพิน (PIN_SERVO_H, INPUT); |
_inConfigMode = digitalRead (PIN_SERVO_H) == 1; |
ส่งคืน _inConfigMode; |
} |
//---------------------------------EEPROM |
voidgetFromEeprom(){ |
ถ้า( |
EEPROM.read(IDX_SIGN_1) != 'S' || |
EEPROM.read(IDX_SIGN_2) != 'T' || |
EEPROM.read(IDX_SIGN_3) != EEPROM_VERSION |
) EEPROM_write_default_configuration(); |
EEPROM_read_configuration(); |
} |
voidEEPROM_write_default_configuration(){ |
Serial.println("EEPROM_write_default_configuration"); |
สำหรับ (int i = 0; i < IDX_END_EEPROM_SET; i++){ |
EEPROM.update(i, _i2cVals); |
} |
EEPROM.update(IDX_SIGN_1, 'S'); |
EEPROM.update (IDX_SIGN_2, 'T'); |
EEPROM.update(IDX_SIGN_3, EEPROM_VERSION); |
} |
voidEEPROM_read_configuration(){ |
Serial.println("EEPROM_read_configuration"); |
สำหรับ (int i = 0; i < IDX_END_EEPROM_SET; i++){ |
_i2cVals = EEPROM.read(i); |
//Serial.println(String(i) + " = " + _i2cVals); |
} |
} |
//--------------------------------- I2C |
voidreceiveEvent (จำนวน int) { |
ถ้า (นับ == I2C_MSG_IN_SIZE) |
{ |
ถ่าน cmd = Wire.read(); |
ดัชนีไบต์ = Wire.read(); |
ค่าไบต์ = Wire.read(); |
สวิตช์ (cmd) { |
case'G': |
ถ้า (ดัชนี< IDX_END_VALUES_GET){ |
_i2cResponse = _i2cVals[ดัชนี]; |
} |
หยุดพัก; |
กรณีของ: |
ถ้า (ดัชนี< IDX_END_EEPROM_SET){ |
_i2cVals[ดัชนี] = ค่า; |
EEPROM.update(ดัชนี _i2cVals[ดัชนี]); |
} |
หยุดพัก; |
ค่าเริ่มต้น: |
กลับ; |
} |
} |
} |
voidrequestEvent() |
{ |
Wire.write(_i2cResponse); |
} |
//--------------------------------- LDRs |
voidgetLightValues(){ |
int valueTopLeft = analogRead (PIN_LDR_TL); |
int valueTopRight = analogRead (PIN_LDR_TR); |
int valueBottomRight = analogRead (PIN_LDR_BR); |
ค่า intBottomLeft = analogRead (PIN_LDR_BL); |
_averageTop = (valueTopLeft + valueTopRight) / 2; |
_averageRight = (valueTopRight + valueBottomRight) / 2; |
_averageBottom = (valueBottomRight + valueBottomLeft) / 2; |
_averageLeft = (valueBottomLeft + valueTopLeft) / 2; |
int avgIntensity = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4; |
_i2cVals[IDX_CURRENT_INTENSITY] = แผนที่ (avgIntensity, 0, 1024, 0, 255); |
} |
//--------------------------------- SERVOS |
voidmoveServos(){ |
Serial.println("ย้ายเซอร์โว"); |
ถ้า ((_averageLeft-_averageRight)>_i2cVals[IDX_H_SENSITIVITY] && (_angleH-_i2cVals[IDX_H_STEP])>_i2cVals[IDX_H_ANGLE_MIN]) { |
//ไปทางซ้าย |
Serial.println("ย้ายเซอร์โวไปทางซ้าย"); |
ล่าช้า(_slowingDelay); |
สำหรับ (int i=0; i < _i2cVals[IDX_H_STEP]; i++){ |
_servoH.write(_angleH--); _servoH.เขียน(_angleH--); |
ล่าช้า (_servoLoopDelay); |
} |
} |
elseif ((_averageRight-_averageLeft)>_i2cVals[IDX_H_SENSITIVITY] && (_angleH+_i2cVals[IDX_H_STEP])<_i2cVals[IDX_H_ANGLE_MAX]) { |
//ไปทางขวา |
Serial.println("ย้ายเซอร์โวไปทางซ้าย"); |
ล่าช้า(_slowingDelay); |
สำหรับ (int i=0; i < _i2cVals[IDX_H_STEP]; i++){ |
_servoH.write(_angleH++); |
ล่าช้า (_servoLoopDelay); |
} |
} |
อื่น { |
// ไม่ได้ทำอะไร |
Serial.println("ย้ายเซอร์โวไม่ทำอะไรเลย"); |
ล่าช้า(_slowingDelay); |
} |
ถ้า ((_averageTop-_averageBottom)>_i2cVals[IDX_V_SENSITIVITY] && (_angleV+_i2cVals[IDX_V_STEP])<_i2cVals[IDX_V_ANGLE_MAX]) { |
// กำลังขึ้นไป |
Serial.println("ย้ายเซอร์โวขึ้นไป"); |
ล่าช้า(_slowingDelay); |
สำหรับ (int i=0; i < _i2cVals[IDX_V_STEP]; i++){ |
_servoV.write(_angleV++); |
ล่าช้า (_servoLoopDelay); |
} |
} |
elseif ((_averageBottom-_averageTop)>_i2cVals[IDX_V_SENSITIVITY] && (_angleV-_i2cVals[IDX_V_STEP])>_i2cVals[IDX_V_ANGLE_MIN]) { |
// กำลังลงไป |
Serial.println("ย้ายเซอร์โวลงไป"); |
ล่าช้า(_slowingDelay); |
สำหรับ (int i=0; i < _i2cVals[IDX_V_STEP]; i++){ |
_servoV.write(_angleV--); _servoV.เขียน(_angleV--); |
ล่าช้า (_servoLoopDelay); |
} |
} |
อื่น { |
Serial.println("ย้ายเซอร์โวไม่ทำอะไรเลย"); |
ล่าช้า(_slowingDelay); |
} |
} |
//---------------------------------นอน |
voidasleepFor(unsignedint eightSecondSegments){ |
Serial.println("หลับสำหรับ"); |
สำหรับ (unsignedint sleepCounter = eightSecondSegments; sleepCounter >0; sleepCounter--) |
{ |
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF); |
} |
} |
ดู rawtilt_pan_tracker_0.3.ino โฮสต์ด้วย ❤ โดย GitHub
ขั้นตอนที่ 4: การประกอบปลอกวงจร
- ตรวจสอบให้แน่ใจว่าได้ใส่ Ardiuno Pro Mini ลงในส่วนหัวของ PCB แล้ว
- ใส่ฐานกล่องควบคุม SOLAR TRACKER ลงในผนังกล่องควบคุม SOLAR TRACKER และยึดด้วยสกรูเกลียวปล่อยสแตนเลสแบบฝังเคาน์เตอร์ขนาด 4G x 6 มม. 2 ตัว
- ใส่ Ardiuno Pro Mini + PCB ที่มีช่องเสียบส่วนหัว 6P ลงในช่องว่างในฐานกล่องควบคุม SOLAR TRACKER
- ใส่ฝาปิดกล่องควบคุม SOLAR TRACKER ลงในผนังกล่องควบคุม SOLAR TRACKER และติดด้วยสกรูเกลียวปล่อยสแตนเลสแบบฝังเคาน์เตอร์ขนาด 4G x 6 มม. 2 ตัว
- ติดชุดประกอบด้านบนเข้ากับฐานของโครงแผงด้วยสกรูเกลียวปล่อยแบบฝังเคาน์เตอร์สเตนเลสสตีลขนาด 4G x 6 มม. 4 ตัว
ขั้นตอนที่ 5: เชื่อมต่อ Rig Leads เข้ากับคอนโทรลเลอร์
การเชื่อมต่อที่เกี่ยวข้องพร้อมจากคำสั่งก่อนหน้าคือการเชื่อมต่อ LDR 2P 2P 4 รายการและการเชื่อมต่อ 3P 2 รายการจากเซอร์โว สิ่งที่อยู่ชั่วคราวจนกว่าการชาร์จจะพร้อมคือแบตเตอรี่ ใช้ 3.7V LiPo ที่สิ้นสุดในการเชื่อมต่อ 2P DuPont ในตอนนี้
-
เสียบขั้วต่อ LDR (ไม่มีขั้ว) จากด้านบน:
- ขวาบน
- บนซ้าย
- ล่างขวา
- ล่างซ้าย
-
ใส่การเชื่อมต่อเซอร์โว (ด้วยสายสัญญาณทางด้านซ้าย) จากด้านบน:
- แนวนอน
- แนวตั้ง
- รอจนพร้อมสำหรับการทดสอบแล้ว: ใส่สายไฟ 3.7V DC Power +ve ไปด้านบน -ve ไปที่ด้านล่าง
ขั้นตอนที่ 6: ทดสอบคอนโทรลเลอร์
ตามที่ระบุไว้ก่อนหน้านี้ ซอฟต์แวร์ไม่ได้รับการปรับให้เหมาะสมสำหรับเวิร์กโฟลว์การชาร์จพลังงานแสงอาทิตย์ สามารถทดสอบและปรับแต่งได้โดยใช้แหล่งกำเนิดแสงธรรมชาติ (แสงอาทิตย์) และแสงที่ไม่เป็นธรรมชาติ
หากต้องการทดสอบการติดตามในสภาพแวดล้อมที่มีการควบคุม อาจสะดวกที่จะตั้งค่า SLEEP MINUTES เป็นค่าที่ต่ำกว่า (ดูขั้นตอนถัดไป)
ขั้นตอนที่ 7: การกำหนดค่าผ่าน I2C โดยใช้คอนโซล Input
ซึ่งจะอธิบายการกำหนดค่าคอนโทรลเลอร์ผ่าน MCU ตัวที่สอง โดยป้อนการตั้งค่าลงในหน้าต่างคอนโซล
- อัปโหลดสคริปต์ต่อไปนี้ไปยัง D1M WIFI BLOCK (หรือ Wemos D1 Mini)
- ถอด USB ออกจาก PC
-
การเชื่อมต่อ PIN:-ve (คอนโทรลเลอร์) => GND (D1M)+ve (คอนโทรลเลอร์) => 3V3 (D1M)SCL (คอนโทรลเลอร์) => D1 (D1M)
SDA (คอนโทรลเลอร์) => D2 (D1M)
- หมุนสวิตช์ SPDT ไปที่ CONFIG
- เชื่อมต่อ USB กับ PC
- จาก Arduino IDE ให้เริ่มหน้าต่างคอนโซลด้วย COM Port. ที่ถูกต้อง
- ตรวจสอบให้แน่ใจว่าได้เลือก "Newline" และ "9600 baud" แล้ว
- คำสั่งจะถูกป้อนลงใน Send Textbox ตามด้วยปุ่ม Enter
- คำสั่งอยู่ในรูปแบบ Character byte byte
- หากไม่รวมไบต์ที่สอง (ส่วนที่สาม) 0 (ศูนย์) ถูกส่งโดยสคริปต์
- โปรดใช้ความระมัดระวังในการใช้อินพุตแบบอนุกรม ตรวจสอบสิ่งที่คุณได้ป้อนก่อนที่จะกดปุ่ม "Enter" หากคุณถูกล็อค (เช่น การเปลี่ยนที่อยู่ I2C เป็นค่าที่คุณลืม) คุณจะต้องแฟลชเฟิร์มแวร์ตัวควบคุมอีกครั้ง
รูปแบบที่รองรับในคำสั่งอักขระตัวแรกคือ:
- E (เปิดใช้งานการติดตามเซอร์โว) มีประโยชน์สำหรับการหยุดการเคลื่อนไหวระหว่างการกำหนดค่า นี่คืออินพุตโดยใช้: E 0
- D (ปิดใช้งานการติดตามเซอร์โว) มีประโยชน์ในการเริ่มการติดตามอัตโนมัติหากไม่ได้รีบูตอุปกรณ์ นี่คืออินพุตโดยใช้: D 0
- G (รับค่าการกำหนดค่า) อ่านค่าจาก EEPROM และ IN-MEMORY: นี่คืออินพุตโดยใช้: G (ดัชนีเป็นค่าไบต์ที่ถูกต้อง 0 - 13 และ 15)
- S (ตั้งค่า EEPROM) ตั้งค่าเป็น EEPROM ซึ่งพร้อมใช้งานหลังจากรีบูต นี่คืออินพุตโดยใช้: S (ดัชนีคือค่าไบต์ที่ถูกต้อง 0 - 13 ค่าคือค่าไบต์ที่ถูกต้องและแตกต่างกันไปตามคุณสมบัติ)
รหัสคือประเด็นของความจริงสำหรับดัชนี แต่ข้อมูลต่อไปนี้ใช้สำหรับเป็นแนวทางสำหรับค่า/ความคิดเห็นที่ถูกต้อง:
- I2C ADDRESS 0 - ที่อยู่สเลฟของคอนโทรลเลอร์ มาสเตอร์ต้องการสิ่งนี้เพื่อสื่อสารกับคอนโทรลเลอร์ (ค่าเริ่มต้น 10)
- MINIMUM VERTICAL ANGLE 1 - ขีดจำกัดล่างของเซอร์โวแนวตั้งมุม (ค่าเริ่มต้น 10, ช่วง 0 - 180)
- MAXIMUM VERTICAL ANGLE 2 - ขีด จำกัด สูงสุดของเซอร์โวแนวตั้งมุม (ค่าเริ่มต้น 170, ช่วง 0 - 180)
- SENSITIVITY VERTICAL LDR 3 - ระยะขอบการอ่าน LDR แนวตั้ง (ค่าเริ่มต้น 20, ช่วง 0 - 1024)
- VERTICAL ANGLE STEP 4 - ขั้นตอนเซอร์โวแนวตั้งมุมในการปรับแต่ละครั้ง (ค่าเริ่มต้น 5, ช่วง 1 - 20)
- MINIMUM HORIZONTAL ANGLE 5 - ขีดจำกัดล่างของเซอร์โวแนวนอนในแนวนอน (ค่าเริ่มต้น 10, ช่วง 0 - 180)
- มุมแนวนอนสูงสุด 6 - ขีดจำกัดบนของเซอร์โวแนวนอนในแนวนอน (ค่าเริ่มต้น 170, ช่วง 0 - 180)
- ความไว HORIZONTAL LDR 7 - ระยะขอบการอ่าน LDR แนวนอน (ค่าเริ่มต้น 20, ช่วง 0 - 1024)
- ขั้นตอนมุมแนวนอน 8 - ขั้นตอนเซอร์โวแนวนอนมุมในการปรับแต่ละครั้ง (ค่าเริ่มต้น 5 ช่วง 1 - 20)
- SLEEP MINUTES 9 - ระยะเวลาการนอนหลับโดยประมาณระหว่างการติดตาม (ค่าเริ่มต้น 20, ช่วง 1 - 255)
- VERTICAL DAWN ANGLE 10 - FUTURE USE - มุมแนวตั้งที่จะกลับไปเมื่อพระอาทิตย์ตกดิน
- HORIZONTAL DAWN ANGLE 11 - การใช้งานในอนาคต - มุมแนวนอนที่จะกลับไปเมื่อพระอาทิตย์ตกดิน
- DAWN INTENSITY 12 - การใช้งานในอนาคต - ค่าเฉลี่ยขั้นต่ำของ LDR ทั้งหมดที่ทริกเกอร์การติดตามดวงอาทิตย์รายวัน
- ความเข้มของแสงยามเย็น 13 - การใช้งานในอนาคต - ค่าเฉลี่ยต่ำสุดของ LDR ทั้งหมดที่ทำให้การติดตามดวงอาทิตย์สิ้นสุดในแต่ละวัน
- จุดสิ้นสุดของเครื่องหมายค่า EEPROM 14 - ไม่ได้ใช้ค่า
- ความเข้มปัจจุบัน 15 - เปอร์เซ็นต์เฉลี่ยปัจจุบันของความเข้มแสง
- จุดสิ้นสุดของค่าในหน่วยความจำ MARKER 16 - ค่าที่ไม่ได้ใช้
จับอินพุตแบบอนุกรม (อินพุตคีย์บอร์ดในหน้าต่างคอนโซล) และส่งต่อไปยังสเลฟ I2C ในรูปแบบถ่าน ไบต์ ไบต์
#รวม |
#defineI2C_MSG_IN_SIZE2 |
#defineI2C_MSG_OUT_SIZE3 |
#defineI2C_SLAVE_ADDRESS10 |
บูลีน _newData = เท็จ; |
ไบต์ const _numChars = 32; |
ถ่าน _receivedChars[_numChars]; // อาร์เรย์เพื่อเก็บข้อมูลที่ได้รับ |
voidsetup() { |
Serial.begin(9600); |
Wire.begin(D2, D1); |
ล่าช้า (5000); |
} |
โมฆะลูป () { |
recvWithEndMarker(); |
parseSendCommands(); |
} |
voidrecvWithEndMarker () { |
ไบต์คงที่ ndx = 0; |
ถ่าน endMarker = '\n'; |
ถ่าน rc; |
ในขณะที่ (Serial.available () >0 && _newData == false) { |
rc = Serial.read(); |
ถ้า (rc != endMarker) { |
_receivedChars[ndx] = rc; |
นดx++; |
ถ้า (ndx >= _numChars) { |
ndx = _numChars - 1; |
} |
} อื่น { |
_receivedChars[ndx] = '\0'; // สิ้นสุดสตริง |
ndx = 0; |
_newData = จริง; |
} |
} |
} |
voidparseSendCommands () { |
ถ้า (_newData == จริง) { |
constchar delim[2] = ""; |
ถ่าน *โทเค็น; |
โทเค็น = strtok(_receivedChars, delim); |
ถ่าน cmd = _receivedChars[0]; |
ดัชนีไบต์ = 0; |
ค่าไบต์ = 0; |
int ผม = 0; |
ในขณะที่ (โทเค็น != NULL) { |
//Serial.println (โทเค็น); |
ผม++; |
สวิตช์ (ผม){ |
กรณีที่ 1: |
โทเค็น = strtok (NULL, ตัวคั่น); |
ดัชนี = atoi(โทเค็น); |
หยุดพัก; |
กรณีที่ 2: |
โทเค็น = strtok (NULL, ตัวคั่น); |
ถ้า (โทเค็น != NULL){ |
ค่า = atoi(โทเค็น); |
} |
หยุดพัก; |
ค่าเริ่มต้น: |
โทเค็น = NULL; |
} |
} |
sendCmd(cmd, ดัชนี, ค่า); |
_newData = เท็จ; |
} |
} |
voidsendCmd (ถ่าน cmd, ดัชนีไบต์, ค่าไบต์) { |
Serial.println("-----"); |
Serial.println("ส่งคำสั่ง:"); |
Serial.println("\t" + สตริง (cmd) + "" + สตริง (ดัชนี) + "" + สตริง (ค่า)); |
Serial.println("-----"); |
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // ส่งไปยังเครื่อง |
Wire.write(cmd); // ส่งตัวอักษร |
Wire.write (ดัชนี); // ส่งหนึ่งไบต์ |
Wire.write (ค่า); // ส่งหนึ่งไบต์ |
Wire.endTransmission(); |
การตอบสนองไบต์ = 0; |
บูล hadResponse = เท็จ; |
ถ้า (cmd == 'G'){ |
Wire.requestFrom(I2C_SLAVE_ADDRESS, 1); |
while(Wire.available()) // ทาสอาจส่งน้อยกว่าที่ร้องขอ |
{ |
hadResponse = จริง; |
ตอบกลับ = Wire.read(); |
} |
ถ้า (hadResponse == จริง){ |
Serial.println("กำลังรับการตอบสนอง:"); |
Serial.println (ตอบกลับ); |
}อื่น{ |
Serial.println("ไม่มีการตอบสนอง ตรวจสอบที่อยู่/การเชื่อมต่อ"); |
} |
} |
} |
ดู rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino โฮสต์ด้วย ❤ โดย GitHub
ขั้นตอนที่ 8: ขั้นตอนถัดไป
กลับมาตรวจสอบเป็นระยะเพื่อตรวจสอบการเปลี่ยนแปลงในซอฟต์แวร์/ฮาร์ดแวร์
แก้ไขซอฟต์แวร์/ฮาร์ดแวร์ตามความต้องการของคุณ
แสดงความคิดเห็นเกี่ยวกับคำขอ/การเพิ่มประสิทธิภาพใดๆ
แนะนำ:
บทช่วยสอน LoRa GPS Tracker - LoRaWAN กับ Dragino และ TTN: 7 ขั้นตอน
บทช่วยสอน LoRa GPS Tracker | LoRaWAN กับ Dragino และ TTN: ว่าไงพวก! Akarsh ที่นี่จาก CETech สองสามโปรเจ็กต์กลับมา เราได้ดูที่ LoRaWAN Gateway จาก Dragino เราเชื่อมต่อโหนดต่างๆ กับเกตเวย์และส่งข้อมูลจากโหนดไปยังเกตเวย์โดยใช้ TheThingsNetwork เป็น s
DIY GPS Tracker --- แอปพลิเคชั่น Python: 5 ขั้นตอน (พร้อมรูปภาพ)
DIY GPS Tracker --- แอปพลิเคชั่น Python: ฉันเข้าร่วมกิจกรรมปั่นจักรยานเมื่อสองสัปดาห์ก่อน เสร็จแล้วก็อยากเช็คเส้นทางและความเร็วที่ขี่ในตอนนั้น น่าเสียดายที่มันไม่ประสบความสำเร็จ ตอนนี้ฉันใช้ ESP32 เพื่อสร้างตัวติดตาม GPS และฉันจะใช้มันเพื่อบันทึกเส้นทางการปั่นจักรยานของฉัน
DIY Fitness Tracker Smart Watch พร้อมเครื่องวัดออกซิเจนและอัตราการเต้นของหัวใจ - โมดูลอิเล็กทรอนิกส์แบบแยกส่วนจาก TinyCircuits - อาเขตที่เล็กที่สุด: 6 ขั้นตอน
DIY Fitness Tracker Smart Watch พร้อมเครื่องวัดออกซิเจนและอัตราการเต้นของหัวใจ | โมดูลอิเล็กทรอนิกส์แบบแยกส่วนจาก TinyCircuits | อาร์เคดที่เล็กที่สุด: เฮ้ ว่าไงพวก! Akarsh จาก CETech วันนี้เรามีโมดูลเซ็นเซอร์บางส่วนที่มีประโยชน์อย่างมากในชีวิตประจำวันของเรา แต่ในรุ่นเล็ก ๆ ของตัวเอง เซนเซอร์ที่เรามีในปัจจุบันมีขนาดเล็กมากเมื่อเทียบกับทรา
สร้าง Wearable Motion Tracker (BLE จาก Arduino ไปยัง Custom Android Studio App): 4 ขั้นตอน
สร้าง Wearable Motion Tracker (BLE จาก Arduino ไปยัง Custom Android Studio App): Bluetooth Low Energy (BLE) เป็นรูปแบบหนึ่งของการสื่อสาร Bluetooth ที่ใช้พลังงานต่ำ อุปกรณ์สวมใส่ได้ เช่น เสื้อผ้าอัจฉริยะ ที่ฉันช่วยออกแบบที่ Predictive Wear ต้องจำกัดการใช้พลังงานในทุกที่ที่ทำได้เพื่อยืดอายุการใช้งานแบตเตอรี่ และใช้ BLE บ่อยครั้ง
ตัวติดตาม COVID19 บนเดสก์ท็อปพร้อมนาฬิกา! Raspberry Pi Powered Tracker: 6 ขั้นตอน
ตัวติดตาม COVID19 บนเดสก์ท็อปพร้อมนาฬิกา! Raspberry Pi Powered Tracker: เรารู้ว่าเราสามารถตายได้ตลอดเวลา แม้ว่าฉันจะตายได้ในขณะที่เขียนโพสต์นี้ ฉันเอง คุณ เราทุกคนต่างก็เป็นมนุษย์ปุถุชน โลกทั้งใบสั่นสะเทือนเพราะการระบาดของ COVID19 เรารู้วิธีป้องกันสิ่งนี้ แต่เดี๋ยวก่อน! เรารู้วิธีอธิษฐานและทำไมต้องอธิษฐาน เราทำ