สารบัญ:

IOT123 - SOLAR TRACKER - ตัวควบคุม: 8 ขั้นตอน
IOT123 - SOLAR TRACKER - ตัวควบคุม: 8 ขั้นตอน

วีดีโอ: IOT123 - SOLAR TRACKER - ตัวควบคุม: 8 ขั้นตอน

วีดีโอ: IOT123 - SOLAR TRACKER - ตัวควบคุม: 8 ขั้นตอน
วีดีโอ: IOT123 - SOLAR TRACKER CONTROLLER TEST 0 3 2024, กรกฎาคม
Anonim
Image
Image
IOT123 - ตัวติดตามพลังงานแสงอาทิตย์ - ตัวควบคุม
IOT123 - ตัวติดตามพลังงานแสงอาทิตย์ - ตัวควบคุม
IOT123 - ตัวติดตามพลังงานแสงอาทิตย์ - ตัวควบคุม
IOT123 - ตัวติดตามพลังงานแสงอาทิตย์ - ตัวควบคุม

นี่คือส่วนขยายของ Instructable

IOT123 - ตัวติดตามพลังงานแสงอาทิตย์ - TILT/PAN, PANEL FRAME, LDR MOUNTS RIG ที่นี่เราเน้นที่ตัวควบคุมเซอร์โวและเซ็นเซอร์ตำแหน่งของดวงอาทิตย์ สิ่งสำคัญคือต้องชี้ให้เห็นว่าการออกแบบนี้สันนิษฐานว่าจะใช้ MCU 2 ตัว: หนึ่งตัว (3.3V 8mHz Arduino Pro Mini) สำหรับตัวติดตามแสงอาทิตย์ และ MCU อิสระหนึ่งตัวสำหรับเซ็นเซอร์/นักแสดงของคุณ

นี่คือเวอร์ชัน 0.3

แทนที่จะเผยแพร่โครงการทั้งหมดหลังจากพึงพอใจอย่างสมบูรณ์แล้ว ฉันจะฝึกการบูรณาการอย่างต่อเนื่องและนำเสนอบางสิ่งบ่อยขึ้น โดยปรับเปลี่ยนสิ่งที่ฉันได้ส่งมอบตามที่ฉันต้องการ ฉันจะเขียนคำแนะนำอื่นสำหรับการชาร์จแบตเตอรี่ _เมื่อ_ การปรับให้เหมาะสมของซอฟต์แวร์ / ฮาร์ดแวร์คอนโทรลเลอร์เสร็จสมบูรณ์ ฉันจะชี้ให้เห็นว่าจำเป็นต้องมีการเพิ่มประสิทธิภาพที่ไหนเมื่อเราทำตามขั้นตอนนี้

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

สิ่งนี้รวมถึง:

  1. ใช้ LDR จาก Instructable ดั้งเดิมเพื่อสัมผัสตำแหน่งโดยประมาณของดวงอาทิตย์
  2. ย้ายเซอร์โวให้หันหน้าเข้าหาดวงอาทิตย์
  3. ตัวเลือกสำหรับความไวของการเคลื่อนไหว
  4. ตัวเลือกสำหรับขนาดขั้นบันไดเมื่อเคลื่อนเข้าหาดวงอาทิตย์
  5. ตัวเลือกสำหรับข้อจำกัดเชิงมุมที่ใช้กับเซอร์โว
  6. ตัวเลือกสำหรับความล่าช้าของการเคลื่อนไหว
  7. อินเทอร์เฟซ I2C สำหรับการตั้งค่า/รับค่าระหว่าง MCU
  8. หลับลึกระหว่างการเคลื่อนไหว

สิ่งนี้ไม่รวมถึง (และจะได้รับการแก้ไขตามเวลาอนุญาต):

  1. ใช้พลังงานในช่วงเวลากลางวันเท่านั้น
  2. จำตำแหน่งรุ่งอรุณและไปที่นั่นตอนพลบค่ำ
  3. การถอดตัวควบคุมออกจาก MCU
  4. ปิดการใช้งาน LED บน MCU
  5. เปลี่ยนเส้นทางพลังงานผ่าน VCC แทนที่จะเป็น RAW
  6. ให้วิธีแก้ไขปัญหาชั่วคราวสำหรับการกะพริบโดยไม่มีไฟควบคุมจากตัวแปลง USB เป็น Serial TTL
  7. ตัวตรวจสอบแรงดันแบตเตอรี่

ประวัติศาสตร์

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 ฉบับเต็มแล้ว

  1. ชิ้นส่วนที่พิมพ์ 3 มิติ
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 จาก 4x6cm Double Side Prototype PCB Universal Printed Circuit Board (ตัดครึ่ง)
  4. 1 ออก 40P ส่วนหัวชาย (เพื่อตัดให้ได้ขนาด)
  5. 1 จากส่วนหัว 40P ตัวเมีย (เพื่อตัดให้ได้ขนาด)
  6. 4 ปิด 10K 1 / 4W รีสเตอร์
  7. สายต่อ.
  8. ประสานและเหล็ก
  9. สกรูเกลียวปล่อยหัวกระทะสแตนเลสขนาด 4G x 6 มม. 20 ตัว
  10. 4 ออก 4G x 6 มม. สแตนเลส countersunk สกรูต๊าปเกลียว
  11. 1 ปิด 3.7V LiPo แบตเตอรี่และที่ยึด (สิ้นสุดในขั้วต่อดูปองท์ 2P)
  12. 1 ปิดส่วนหัวมุมขวาชาย 2P
  13. 1 ปิดสวิตช์ SPDT 3 ขา 2.54 มม. pitch
  14. กาวไซยาโนอะคริเลตที่แข็งแกร่ง
  15. ขั้วต่อ Dupont ตัวเมีย 1P ส่วนหัว (1 ปิดสีน้ำเงิน 1 ปิดสีเขียว)

ขั้นตอนที่ 2: การประกอบวงจร

การประกอบวงจร
การประกอบวงจร
การประกอบวงจร
การประกอบวงจร
การประกอบวงจร
การประกอบวงจร

ปัจจุบันวงจรไม่มีวงจรแบ่งแรงดัน (volt meter)

  1. ตัดแผงวงจรพิมพ์สากล PCB ต้นแบบสองด้านขนาด 4x6 ซม. ครึ่งหนึ่งตามแกนยาว
  2. ตัดส่วนหัวชาย 40P เป็นชิ้น ๆ:

    1. 2 ปิด 12P
    2. 3 ปิด 3P
    3. 6 ออก 2P
  3. ตัดส่วนหัวเพศหญิง 40P เป็นชิ้น ๆ:

    1. 2 ปิด 12P
    2. 1 ออก 6P
  4. ประสาน 2 ปิด 12Pfemale ส่วนหัวตามที่แสดง
  5. กาวตัวเว้นวรรคที่นำออกจากส่วนหัว 3P ตัวผู้ (เพิ่มเติม) ที่ด้านล่างของสวิตช์ SPDT ด้วยกาวไซยาโนอะคริเลต
  6. ที่ด้านอื่น ๆ ให้บัดกรี 6 ปิด 2P, 2 ปิดส่วนหัว 3Pmale และสวิตช์ SPDT ตามที่แสดง
  7. บัดกรี 4 จากตัวต้านทาน 10K (A, B, C, D สีดำ) ผ่านตะกั่วไปยังส่วนหัวพิน GND (#2 สีดำ) และไปยังหมุดส่วนหัว A0 - A3 (#5, #6, #7, #8) จากนั้นผ่านรู (สีเหลือง) ตามที่แสดง (3 รูป + 1 แผนภาพ)
  8. ติดตาม 3.3V จาก LDR PINS บัดกรี PINS #4, #6, #8, #10 และเกลียวแม้ว่ารูถึงส่วนหัว feamale ขา VCC (สีเขียว)
  9. ติดตาม 3.3V ที่ด้านส่วนหัวของตัวเมียตามที่แสดง (สีแดง) บัดกรีที่ PINS #1, #12, #15
  10. 3.3V ผ่านรูที่บัดกรีด้านบน (สีแดง) PIN ส่วนหัว RAW #1
  11. ติดตามการเชื่อมต่อสีส้มจาก PIN #11 ผ่านรูเพื่อบัดกรีหมุดตัวเมียที่อีกด้านหนึ่งตามที่แสดง
  12. ติดตามและบัดกรีสายเชื่อมต่อสีน้ำเงินจาก #20 ถึง #30 และ #31 ถึง #13 และ #16
  13. PIN ส่วนหัวของตัวเมียบัดกรี #11 ถึง PIN ส่วนหัวของตัวผู้ #11 ผ่านรู
  14. เตรียมขั้วต่อดูปองท์ 2 ตัว ยาว 30 มม. พร้อมส่วนหัว 1P ตัวเมีย (สีน้ำเงิน 1 อัน และสีเขียว 1 อัน) แถบและดีบุกปลายอีกด้านหนึ่ง
  15. ลวดบัดกรีดูปองท์สีน้ำเงินถึง #28; บัดกรีลวดดูปองท์สีเขียวกับ #29
  16. ที่ด้านบนของ Arduino แก้ไขส่วนหัวของตัวเมีย 6P แล้วบัดกรี
  17. ที่ด้านบนของ Arduino แก้ไขส่วนหัวของตัวเมียมุมฉาก 2P int #29 และ #30 จากนั้นประสาน
  18. ที่ด้านล่างของ Arduino แก้ไขหมุดตัวผู้ 2 ตัวจาก 12P และ 1 จาก 3P จากนั้นบัดกรี
  19. ใส่หมุด 12P ตัวผู้ของ Arduino ลงในส่วนหัว PCB 12P ตัวเมีย

ขั้นตอนที่ 3: กะพริบ MCU

กระพริบ MCU
กระพริบ MCU
กระพริบ MCU
กระพริบ MCU
กระพริบ MCU
กระพริบ 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: การประกอบปลอกวงจร

การประกอบปลอกวงจร
การประกอบปลอกวงจร
การประกอบปลอกวงจร
การประกอบปลอกวงจร
การประกอบปลอกวงจร
การประกอบปลอกวงจร
  1. ตรวจสอบให้แน่ใจว่าได้ใส่ Ardiuno Pro Mini ลงในส่วนหัวของ PCB แล้ว
  2. ใส่ฐานกล่องควบคุม SOLAR TRACKER ลงในผนังกล่องควบคุม SOLAR TRACKER และยึดด้วยสกรูเกลียวปล่อยสแตนเลสแบบฝังเคาน์เตอร์ขนาด 4G x 6 มม. 2 ตัว
  3. ใส่ Ardiuno Pro Mini + PCB ที่มีช่องเสียบส่วนหัว 6P ลงในช่องว่างในฐานกล่องควบคุม SOLAR TRACKER
  4. ใส่ฝาปิดกล่องควบคุม SOLAR TRACKER ลงในผนังกล่องควบคุม SOLAR TRACKER และติดด้วยสกรูเกลียวปล่อยสแตนเลสแบบฝังเคาน์เตอร์ขนาด 4G x 6 มม. 2 ตัว
  5. ติดชุดประกอบด้านบนเข้ากับฐานของโครงแผงด้วยสกรูเกลียวปล่อยแบบฝังเคาน์เตอร์สเตนเลสสตีลขนาด 4G x 6 มม. 4 ตัว

ขั้นตอนที่ 5: เชื่อมต่อ Rig Leads เข้ากับคอนโทรลเลอร์

การเชื่อมต่อแท่นขุดเจาะเข้ากับคอนโทรลเลอร์
การเชื่อมต่อแท่นขุดเจาะเข้ากับคอนโทรลเลอร์
การเชื่อมต่อแท่นขุดเจาะเข้ากับคอนโทรลเลอร์
การเชื่อมต่อแท่นขุดเจาะเข้ากับคอนโทรลเลอร์
การเชื่อมต่อแท่นขุดเจาะกับคอนโทรลเลอร์
การเชื่อมต่อแท่นขุดเจาะกับคอนโทรลเลอร์

การเชื่อมต่อที่เกี่ยวข้องพร้อมจากคำสั่งก่อนหน้าคือการเชื่อมต่อ LDR 2P 2P 4 รายการและการเชื่อมต่อ 3P 2 รายการจากเซอร์โว สิ่งที่อยู่ชั่วคราวจนกว่าการชาร์จจะพร้อมคือแบตเตอรี่ ใช้ 3.7V LiPo ที่สิ้นสุดในการเชื่อมต่อ 2P DuPont ในตอนนี้

  1. เสียบขั้วต่อ LDR (ไม่มีขั้ว) จากด้านบน:

    1. ขวาบน
    2. บนซ้าย
    3. ล่างขวา
    4. ล่างซ้าย
  2. ใส่การเชื่อมต่อเซอร์โว (ด้วยสายสัญญาณทางด้านซ้าย) จากด้านบน:

    1. แนวนอน
    2. แนวตั้ง
  3. รอจนพร้อมสำหรับการทดสอบแล้ว: ใส่สายไฟ 3.7V DC Power +ve ไปด้านบน -ve ไปที่ด้านล่าง

ขั้นตอนที่ 6: ทดสอบคอนโทรลเลอร์

Image
Image

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

หากต้องการทดสอบการติดตามในสภาพแวดล้อมที่มีการควบคุม อาจสะดวกที่จะตั้งค่า SLEEP MINUTES เป็นค่าที่ต่ำกว่า (ดูขั้นตอนถัดไป)

ขั้นตอนที่ 7: การกำหนดค่าผ่าน I2C โดยใช้คอนโซล Input

ซึ่งจะอธิบายการกำหนดค่าคอนโทรลเลอร์ผ่าน MCU ตัวที่สอง โดยป้อนการตั้งค่าลงในหน้าต่างคอนโซล

  1. อัปโหลดสคริปต์ต่อไปนี้ไปยัง D1M WIFI BLOCK (หรือ Wemos D1 Mini)
  2. ถอด USB ออกจาก PC
  3. การเชื่อมต่อ PIN:-ve (คอนโทรลเลอร์) => GND (D1M)+ve (คอนโทรลเลอร์) => 3V3 (D1M)SCL (คอนโทรลเลอร์) => D1 (D1M)

    SDA (คอนโทรลเลอร์) => D2 (D1M)

  4. หมุนสวิตช์ SPDT ไปที่ CONFIG
  5. เชื่อมต่อ USB กับ PC
  6. จาก Arduino IDE ให้เริ่มหน้าต่างคอนโซลด้วย COM Port. ที่ถูกต้อง
  7. ตรวจสอบให้แน่ใจว่าได้เลือก "Newline" และ "9600 baud" แล้ว
  8. คำสั่งจะถูกป้อนลงใน Send Textbox ตามด้วยปุ่ม Enter
  9. คำสั่งอยู่ในรูปแบบ Character byte byte
  10. หากไม่รวมไบต์ที่สอง (ส่วนที่สาม) 0 (ศูนย์) ถูกส่งโดยสคริปต์
  11. โปรดใช้ความระมัดระวังในการใช้อินพุตแบบอนุกรม ตรวจสอบสิ่งที่คุณได้ป้อนก่อนที่จะกดปุ่ม "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: ขั้นตอนถัดไป

กลับมาตรวจสอบเป็นระยะเพื่อตรวจสอบการเปลี่ยนแปลงในซอฟต์แวร์/ฮาร์ดแวร์

แก้ไขซอฟต์แวร์/ฮาร์ดแวร์ตามความต้องการของคุณ

แสดงความคิดเห็นเกี่ยวกับคำขอ/การเพิ่มประสิทธิภาพใดๆ

แนะนำ: