Բովանդակություն:

IOT123 - SOLAR TRACKER - CONTROLLER: 8 քայլ
IOT123 - SOLAR TRACKER - CONTROLLER: 8 քայլ

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 քայլ

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 քայլ
Video: IOT123 - SOLAR TRACKER CONTROLLER TEST 0 3 2024, Նոյեմբեր
Anonim
Image
Image
IOT123 - Արևային հետախույզ - վերահսկիչ
IOT123 - Արևային հետախույզ - վերահսկիչ
IOT123 - Արևային հետախույզ - վերահսկիչ
IOT123 - Արևային հետախույզ - վերահսկիչ

Սա Instructable- ի ընդլայնումն է

IOT123 - ԱՐԵՎԱԿԱՅԻՆ ԱՌԵՎՏՈՐ - ԹԻԼՏ/ՊԱՆ, ՊԱՆԵԼԻ ՇՐԱՆ, LDR MOUNTS RIG: Այստեղ մենք կենտրոնանում ենք սերվերի վերահսկիչի և արևի դիրքի տվիչների վրա: Կարևոր է նշել, որ այս դիզայնը ենթադրում է, որ կօգտագործվի 2 MCU ՝ մեկը (3.3V 8 մՀց հաճախականությամբ Arduino Pro Mini) արևային հետագծիչի համար, և մեկ անկախ MCU ՝ ձեր տվիչների/դերասանների համար:

Սա 0.3 տարբերակ է:

Բոլոր նախագծերը լիարժեք գոհունակությունից հետո հրապարակելու փոխարեն, ես կիրականացնեմ շարունակական ինտեգրում և ավելի հաճախ ինչ -որ բան կներկայացնեմ ՝ փոփոխելով այն, ինչ հասցրել եմ ըստ անհրաժեշտության: Մարտկոցի լիցքավորիչի համար ես կգրեմ մեկ այլ հրահանգ, երբ վերահսկիչի ծրագրակազմի/սարքավորման օպտիմալացումն ավարտված լինի: Ես նշելու եմ, թե որտեղ են անհրաժեշտ օպտիմալացումները, երբ մենք անցնում ենք դրան:

Այս մոտեցման պատճառների մի մասը հաճախորդների հետադարձ կապն է: Եթե դուք տեսնում եք, որ կարիք կա կամ ավելի լավ մոտեցում ունեք, խնդրում եմ մեկնաբանեք, բայց հիշեք, որ ես չեմ կարող ամեն ինչ հասցնել, և, հնարավոր է, ոչ ձեզ հարմար ժամանակաշրջանի: Քանի որ այս բացատրություններն ավելի քիչ տեղին են թվում, դրանք կջնջվեն այս հոդվածից:

Ինչ է սա ներառում

  1. Օգտագործեք LDR- երը բնօրինակի Instructable- ից ՝ արևների մոտավոր գտնվելու վայրը զգալու համար:
  2. Սերվոները տեղափոխեք արևի երես:
  3. Շարժումների զգայունության ընտրանքներ:
  4. Արև տեղափոխվելիս քայլի չափի ընտրանքներ:
  5. Սերվերի վրա օգտագործվող անկյունային սահմանափակումների ընտրանքներ:
  6. Շարժումների ձգձգումների ընտրանքներ:
  7. I2C ինտերֆեյս ՝ MCU- ների միջև արժեքներ սահմանելու/ստանալու համար:
  8. Խորը քուն շարժումների միջև:

Այն, ինչ սա չի ներառում (և կանդրադառնա ըստ ժամանակի թույլտվության).

  1. Էլեկտրաէներգիայի օգտագործումը միայն ցերեկային ժամերին:
  2. Հիշելով լուսաբացի դիրքը և այնտեղ գնալ մայրամուտի անջատման ժամանակ:
  3. Կարգավորիչը հեռացնելով MCU- ից:
  4. MCU- ի վրա LED- ների անջատում:
  5. Էլեկտրաէներգիայի վերահասցեավորում VCC- ի և ոչ թե RAW- ի միջոցով:
  6. USB- ից Serial TTL փոխարկիչից առանց կարգավորվող հոսանքի առկայծման լուծումներ ապահովելը:
  7. Մարտկոցի լարման մոնիտոր:

ՊԱՏՄՈԹՅՈՆ

20 դեկտեմբերի, 2017 V0.1 ԿՈԴ

Նախնական տարբերակը հետևում է լույսի աղբյուրին, միշտ միացված է, առանց լիցքավորման

7 հունվարի, 2018 V0.2 ԿՈԴ

  • HARDWARE ՓՈՓՈԽՈԹՅՈՆՆԵՐ

    • Ավելացրեք I2C կապում
    • Անջատիչ ավելացրեք servo GND- ներին
    • Տպագրված պիտակ վերահսկիչի տուփի ֆասիայի վրա
  • SOՐԱԳԻՐ ՓՈՓՈԽՈԹՅՈՆՆԵՐ

    • Կարդացեք EEPROM- ի կազմաձևը
    • I2C ավտոբուսի աջակցություն ՝ որպես ստրուկ մեկ այլ MCU- ի (3.3V)
    • Կարգավորումը սահմանեք I2C- ի միջոցով
    • Միացրեք միացված է I2C- ի միջոցով
    • Ստացեք կազմաձևում I2C- ի միջոցով
    • Ստացեք գործարկման հատկություններ I2C- ի միջոցով (ներկայումս միացված է և լույսի ընթացիկ ինտենսիվությունը)
    • Հեռացնել սերիական գրանցումը (դա ազդել է I2C արժեքների վրա)

19 հունվարի, 2018 V0.3 ԿՈԴ

  • HARDWARE

    Պիտակը թարմացվեց: Անջատիչն այժմ օգտագործվում է CONFIG կամ TRACK ռեժիմ ընտրելու համար

  • SOՐԱԳԻՐ

    • I2C- ն օգտագործվում է միայն կազմաձևման համար
    • Վերահսկիչը սպասում է 5 վայրկյան նախքան հետագծումը նախաստորագրելը, թույլ է տալիս շարժել ձեռքերը
    • I2C կոնֆիգուրացիան օգտագործելու համար SPDT- ը պետք է լինի CONFIG- ում որպես միավորի կոշիկներ
    • Հետևման շարժման միջև ընկած ժամանակահատվածում միավորը գտնվում է խոր քնի ռեժիմում ՝ SLEEP MINUTES (նախնական 20 րոպե) կազմաձևման արժեքի համար:

Քայլ 1: Նյութեր և գործիքներ

Նյութեր և գործիքներ
Նյութեր և գործիքներ
Նյութեր և գործիքներ
Նյութեր և գործիքներ
Նյութեր և գործիքներ
Նյութեր և գործիքներ

Այժմ կա Նյութերի և աղբյուրների ամբողջական ցանկ:

  1. 3D տպագիր մասեր:
  2. Arduino Pro Mini 3.3V 8 մՀց
  3. 1 -ից 4x6 սմ երկկողմանի նախատիպ PCB ունիվերսալ տպագիր տպատախտակ (կիսով չափ կտրվելու է)
  4. 1P 40P արական վերնագիր (կտրվելու է չափի):
  5. 1 հատ 40P իգական վերնագիր (կտրվելու է չափի):
  6. 4 անջատված 10K 1/4W ռեզիստորներով:
  7. Միացման մետաղալար:
  8. Oldոդման և երկաթի:
  9. 20 անջատված 4G x 6 մմ չժանգոտվող թավայի գլխիկով ինքնահպման պտուտակներ:
  10. 4 անջատված 4G x 6 մմ չժանգոտվող ինքնասպասարկման պտուտակներ:
  11. 1 անջատված 3.7 Վ LiPo մարտկոց և պահիչ (վերջանում է 2P dupont միակցիչներում):
  12. 1 զույգ 2P արական անկյունի վերնագիր
  13. 1 անջատված SPDT անջատիչ 3 փին 2.54 մմ սկիպիդար
  14. Ուժեղ ցիանոակրիլատ սոսինձ
  15. Dupont միակցիչներ իգական 1P վերնագիր (1 -ը ՝ կապույտ, 1 -ը ՝ կանաչ):

Քայլ 2. Շրջանի հավաքում

Շրջանի հավաքում
Շրջանի հավաքում
Շրջանի հավաքում
Շրջանի հավաքում
Շրջանի հավաքում
Շրջանի հավաքում

Շղթան ներկայումս չունի Լարման բաժանարար շրջան (վոլտ մետր):

  1. Կտրեք 4x6 սմ երկկողմանի նախատիպի PCB Universal Printed Circuit Board- ը երկար առանցքի երկայնքով:
  2. Կտրեք 40P արական վերնագիրը կտորների.

    1. 2 զեղչով 12P
    2. 3 զեղչ 3P
    3. 6 զեղչ 2P
  3. Կտրեք 40P իգական գլուխը կտորների.

    1. 2 զեղչով 12P
    2. 1 զեղչ 6P
  4. Oldոդիչ 2 հատ 12 Կնոջ վերնագիր, ինչպես ցույց է տրված:
  5. Կպցրեք 3P արական (լրացուցիչ) վերնագրից հանված հեռավորությունը SPDT անջատիչի ներքևի մասում ցիանոակրիլատ սոսինձով
  6. Մյուս կողմում այնուհետև կպցրեք 6 անջատված 2P, 2 անջատված 3Pmale վերնագիր և SPDT անջատիչ, ինչպես ցույց է տրված:
  7. Oldոդեք 4 անջատված 10K դիմադրիչներ (A, B, C, D սև) կապարով դեպի GND կապիչ վերնագիր (#2 սև) և A0 - A3 վերնագրի կապումներով (#5, #6, #7, #8), այնուհետև անցքի միջով (դեղին) ինչպես ցույց է տրված (3 լուսանկար + 1 դիագրամ):
  8. Հետևեք 3.3 Վ LDR PINS- ներից ՝ #4, #6, #8, #10 և PINS զոդման PINS- երից և միացրեք անցքը դեպի գլխավոր էջանիշի VCC քորոցը (կանաչ):
  9. Հետևեք 3.3 Վ -ի կանացի վերնագրի կողքին, ինչպես ցույց է տրված (կարմիր), զոդում PINS #1, #12, #15:
  10. 3.3 Վ անցքի միջով զոդված (կարմիր) RAW վերնագրի PIN #1:
  11. Հետևեք նարնջագույն միացմանը PIN #11 -ից անցքի միջոցով մյուս կողմում իգական քորոցը կպցնելու համար, ինչպես ցույց է տրված:
  12. Հետևեք և կպցրեք կապույտ կապի մետաղալարեր թիվ 20 -ից մինչև #30 -ը և #31 -ից մինչև #13 -ը և #16 -ից:
  13. Oldոդող իգական վերնագրի PIN #11 դեպի Արական վերնագրի PIN #11 անցք անցքի միջոցով:
  14. Պատրաստեք 2 դուպոնտի միակցիչ ՝ 30 մմ երկարությամբ, 1P կանացի վերնագրով (1 -ը ՝ կապույտ, 1 -ը ՝ կանաչ): Շերտ և թիթեղ ՝ մյուս ծայրով:
  15. Blueոդեք կապույտ Dupont մետաղալարը #28 -ին; erոդել կանաչ Dupont մետաղալարը թիվ 29 -ին:
  16. Arduino- ի վերևում ամրացրեք 6P կանացի վերնագիրը, այնուհետև զոդեք:
  17. Arduino- ի գագաթին ամրացրեք 2P ուղղանկյուն իգական վերնագիրը int #29 և #30, այնուհետև զոդեք:
  18. Arduino- ի ներքևի մասում ամրացրեք 12P և 1P 3P արական 2 կապոցները, այնուհետև ամրացրեք դրանք:
  19. Տեղադրեք Arduino արական 12P կապում PCB 12P իգական վերնագրերի մեջ:

Քայլ 3: Flashրամեկուսացում MCU- ի համար

Flashրամեկուսացում MCU
Flashրամեկուսացում MCU
Flashրամեկուսացում MCU
Flashրամեկուսացում MCU
Flashրամեկուսացում MCU
Flashրամեկուսացում MCU

Arduino Pro Mini- ն հարմար փայլեցվում է ՝ օգտագործելով FTDI232 USB to TTL փոխարկիչ ՝ օգտագործելով 6P կանացի վերնագիր: 2 տախտակների հավասարեցման համար տես վերևի լուսանկարը:

Համոզվեք, որ 3.3V կարգավորումը ընտրված է ձեր FTDI232- ում: Հետևեք այստեղ տրված հրահանգներին ՝ օգտագործելով ստորև նշված կոդը (օգտագործեք GIST- ի հղումը):

Pածր հզորության գրադարանը (կցված և https://github.com/rocketscream/Low-Power) անհրաժեշտ է տեղադրել:

Arduino Pro Mini + PCB- ը պատյանում տեղադրվելուց հետո այն դեռ կարող է փայլել, քանի որ վերնագրի քորոցները բաց են: Պարզապես անջատեք Controller Unit- ը Panel Frame- ից, որը բացահայտում է վերնագիրը:

Tilt pan արևային որոնիչ I2C/EEPROM կազմաձևով և շարժումների միջև քնի ցիկլով: Քնի ցիկլի տևողության ճշգրտությունը նվազում է, քանի որ տևողությունը մեծանում է, բայց բավարար է այդ նպատակով:

/*
* փոփոխված է կոդից
* Մաթիաս Լերոյի կողմից
*
* V0.2 ՓՈՓՈԽՈԹՅՈՆՆԵՐ
** I2C SET GET
** EEPROM SET GET
** ՀԵՌԱՆԵԼ ՍԵՐԻԱԼ ԵԼՔ - ԱFԵ I2C
** ԱՌԱԱՐԿԵԼ/Հաշմանդամություն ունեցող հետապնդում
** ERԱՌԱՅՈԹՅՈՆՆԵՐԸ ՍԱՀՄԱՆԱՓՈԽԵԼ I2C- ի միջոցով
** ԿԱՐԴԱԼ ԸՆԹԱԻԿ Ա AVԳԻ ԻՆՏԵՆԻՈԹՅՈՆ VIA I2C- ի միջոցով
* V0.3 ՓՈՓՈԽՈԹՅՈՆՆԵՐ
** ՓՈՓՈԽՈԹՅՈՆ 2 ՕԳՈՄՆԵՐԻ ՀԱՄԱՐ - TRACK (NO I2C) և ԿԱՐԳԱՎՈՐՈՄ (օգտագործում է I2C)
** ՔՆԵԼ ՔԱԱՔՈՄ
** ՔՆԵԼ/ԱՐԹԵԼՈER DԱՌԱՅՈԹՅՈETՆՆԵՐԸ (TRԱՌԱՅՈԹՅՈՆՆԵՐԸ)
** ՀԵՌՆԵԼ ԿԱՌՈURՎԱ ԿԱՌԱՎԱՐՈԹՅԱՆ ՊԱՇՏՈՆԸ (ավելորդ)
** ՀԵՌՆԵԼ ԿԱՐԳԱՎՈՐՎԱ Ա WԳԱՅԻՆ ԵՐԿՐՈՐԴ (ավելորդ)
** ՀԵՌՆԵԼ ԿԱՐԳԱՎՈՐՎԱ ԱՇԽԱՐՀԱԳՈՐՄԱՆ/ԱՇԽԱՏԵԼՈ (ԹՅՈՆԸ (ավելորդ)
** ՀԵՌԱԳՐԵԼ ԿԱՌՈIGՎԱ ԿԵՏԱԿԱԼՈԹՅՈՆԸ
** ՀԱՆՁՆԵԼ ԼՈՅԸ - Կօգտագործի ԱՌԱՆ I2C բաղադրիչը
** ԱՎԵԼԱERՆԵԼ ՍԵՐԻԱԼ ՄԱՍՆԱԳԻՏՈԹՅՈՆ, I2C չօգտագործելիս
*/
#ներառում
#ներառում
#ներառում
#ներառում
#ներառում
#սահմանելEEPROM_VERSION1
#defineI2C_MSG_IN_SIZE3
#սահմանել PIN_LDR_TL A0
#սահմանել PIN_LDR_TR A1
#սահմանել PIN_LDR_BR A3
#սահմանել PIN_LDR_BL A2
#սահմանել PIN_SERVO_V11
#սահմանել PIN_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- ների միջինը
#սահմանել IDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // բոլոր LDRS- ների միջինը - օգտագործվում է IDX_DAWN_INTENSITY- ի ոչ ուղղակի լույսը հաշվարկելու համար
#defineIDX_END_VALUES_GET16
#defineIDX_SIGN_117
#defineIDX_SIGN_218
#defineIDX_SIGN_319
Servo _servoH;
Servo _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 = false;
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 (ReceEvent);
Wire.onRequest (requestEvent);
} ուրիշ {
Serial.println («Հետագծման ռեժիմ»);
հետաձգում (5000); // մարտկոցը միացնելու դեպքում ձեռքերից հեռանալու ժամանակը և այլն:
}
}
voidloop ()
{
getLightValues ();
եթե (! _inConfigMode) {
// Անելիք. Միացնել Տրանզիստորային անջատիչը
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
համար (int i = 0; i <20; i ++) {
եթե (ես! = 0) {
getLightValues ();
}
moveServos ();
}
ուշացում (500);
_servoH.detach ();
_servoV.detach ();
// ToDo: ԱՆFՆԵԼ TRANSISTOR SWITCH
ուշացում (500);
քնած համար ((_ _ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// ------------------------------------- Ընթացիկ ռեժիմ
boolinConfigMode () {
pinMode (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. կարդալ (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)
{
char cmd = Wire.read ();
բայթ ինդեքս = Wire.read ();
բայթ արժեքը = Wire.read ();
անջատիչ (սմդ) {
case'G ':
եթե (ինդեքս <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [ինդեքս];
}
ընդմիջում;
case'S ':
եթե (ինդեքս <IDX_END_EEPROM_SET) {
_i2cVals [ինդեքս] = արժեք;
EEPROM.update (ինդեքս, _i2cVals [ինդեքս]);
}
ընդմիջում;
կանխադրված:
վերադարձ;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// --------------------------------- LDR- ներ
voidgetLightValues () {
int valueTopLeft = analogRead (PIN_LDR_TL);
int valueTopRight = analogRead (PIN_LDR_TR);
int valueBottomRight = analogRead (PIN_LDR_BR);
int valueBottomLeft = 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] = քարտեզ (միջին ինտենսիվություն, 0, 1024, 0, 255);
}
// --------------------------------- ՍԵՐՎՈՍ
voidmoveServos () {
Serial.println ("moveServos");
if ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// գնում ձախ
Serial.println ("moveServos պատրաստվում ձախ");
ուշացում (_slowingDelay);
համար (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH. գրել (_angleH--);
ուշացում (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {{
// աջ գնալ
Serial.println ("moveServos պատրաստվում ձախ");
ուշացում (_slowingDelay);
համար (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
ուշացում (_servoLoopDelay);
}
}
ուրիշ {
// ոչինչ չանել
Serial.println ("moveServos ոչինչ չի անում");
ուշացում (_slowingDelay);
}
եթե ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// բարձրանում
Serial.println ("moveServos going up");
ուշացում (_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 ("moveServos իջնում է");
ուշացում (_slowingDelay);
համար (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
ուշացում (_servoLoopDelay);
}
}
ուրիշ {
Serial.println ("moveServos ոչինչ չի անում");
ուշացում (_slowingDelay);
}
}
// --------------------------------- ՔՆԵԼ
voidasleepFor (անստորագիր ութ Երկրորդ հատված) {
Serial.println ("քնած է");
համար (unsignedint sleepCounter = ութ Երկրորդը հատվածներ; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

դիտել rawtilt_pan_tracker_0.3.ino- ն, որը տեղակայված է it -ի կողմից GitHub- ի կողմից

Քայլ 4. Շղթայի պատյանների հավաքում

Շրջանակային պատյանների հավաքում
Շրջանակային պատյանների հավաքում
Շրջանակային պատյանների հավաքում
Շրջանակային պատյանների հավաքում
Շրջանակային պատյանների հավաքում
Շրջանակային պատյանների հավաքում
  1. Համոզվեք, որ Ardiuno Pro Mini- ն տեղադրված է PCB- ի վերնագրերի մեջ:
  2. Տեղադրեք SOLAR TRACKER վերահսկիչի տուփի հիմքը SOLAR TRACKER վերահսկիչի տուփի պատերի մեջ և ամրացրեք 2 անջատված 4G x 6 մմ չժանգոտվող հակակոռուպցիոն ինքնահպման պտուտակներով:
  3. Տեղադրեք Ardiuno Pro Mini + PCB 6P վերնագրով, որը տեղադրված է դատարկության մեջ SOLAR TRACKER վերահսկիչ տուփի հիմքում:
  4. Տեղադրեք SOLAR TRACKER վերահսկիչի տուփի կափարիչը SOLAR TRACKER վերահսկիչի տուփի պատերի մեջ և ամրացրեք 2 անջատված 4G x 6 մմ չժանգոտվող հակակոռուպցիոն ինքնահպման պտուտակներով:
  5. Վերևում ամրացրեք վահանակի շրջանակի հիմքին `4 անջատված 4G x 6 մմ չժանգոտվող հակակոռուպցիոն ինքնահպման պտուտակներով:

Քայլ 5. Rig հանգույցների միացում վերահսկիչին

Rig կապը վերահսկիչին միացնելը
Rig կապը վերահսկիչին միացնելը
Rig կապը վերահսկիչին միացնելը
Rig կապը վերահսկիչին միացնելը
Rig կապը վերահսկիչին միացնելը
Rig կապը վերահսկիչին միացնելը

Համապատասխան միացումները, որոնք պատրաստ են նախորդ Instructable- ից, 4 -ից 2P LDR միացում և 2 անջատված 3P միացում են սպասարկողներից: Մինչև լիցքավորման պատրաստ լինելը ժամանակավոր է մարտկոցը: Առայժմ օգտագործեք 3.7 Վ LiPo, որն ավարտվում է 2P DuPont կապով:

  1. Տեղադրեք LDR միացումները (առանց բևեռականության) վերևից.

    1. Վերին աջ
    2. Վերին ձախ
    3. Ստորին Աջ
    4. Ստորին ձախ
  2. Տեղադրեք Servo միացումները (ազդանշանի լարով դեպի ձախ) վերևից.

    1. Հորիզոնական
    2. Ուղղահայաց
  3. ՍՊԱՍԵՔ ՄԻՆՉԵՎ ՊԱՏՐԱՍՏՈ TՄ ԹԵՍՔԻ ՀԱՄԱՐ. Տեղադրեք 3.7V DC հոսանքի հոսանքը +ve վերևում, -մինչև ներքև:

Քայլ 6: Կառավարիչի փորձարկում

Image
Image

Ինչպես արդեն նշվեց, ծրագրակազմը օպտիմիզացված չէ Արևային լիցքավորման աշխատանքային հոսքի համար: Այն կարող է փորձարկվել և շտկվել ՝ օգտագործելով բնական (արևի) և անբնական լույսի աղբյուրներ:

Հետևումը վերահսկվող միջավայրում փորձարկելու համար կարող է հարմար լինել SLEEP MINUTES- ը ավելի ցածր արժեքի վրա (տե՛ս հաջորդ քայլը):

Քայլ 7. Կարգավորեք I2C- ի միջոցով `օգտագործելով վահանակի մուտքը

Սա բացատրում է կարգավորիչի կարգավորումը երկրորդ MCU- ի միջոցով `կարգավորումները մուտքագրելով վահանակի պատուհանում:

  1. Վերբեռնեք հետևյալ սցենարը D1M WIFI BLOCK (կամ Wemos D1 Mini):
  2. Անջատեք USB- ը համակարգչից
  3. PIN միացումներ. -Ve (Controller) => GND (D1M)+ve (Controller) => 3V3 (D1M) SCL (Controller) => D1 (D1M)

    SDA (վերահսկիչ) => D2 (D1M)

  4. Միացրեք SPDT անջատիչը CONFIG- ին
  5. USB- ը միացրեք համակարգչին
  6. Arduino IDE- ից սկսեք մխիթարել պատուհանը `ճիշտ COM նավահանգստով
  7. Համոզվեք, որ ընտրված են «Newline» և «9600 baud»
  8. Հրամանները մուտքագրվում են Send Textbox, որին հաջորդում է Enter ստեղնը
  9. Հրամանները գտնվում են Character byte byte ձևաչափով
  10. Եթե երկրորդ բայթը (երրորդ հատվածը) ներառված չէ, 0 (զրո) ուղարկվում է սցենարի կողմից
  11. Carefulգույշ եղեք սերիական մուտքագրման միջոցով. վերանայեք, թե ինչ եք մուտքագրել նախքան «Enter» ստեղնը սեղմելը: Եթե դուք արգելափակված եք (օրինակ, I2C հասցեն փոխելով մոռացված արժեքի), ձեզ հարկավոր է նորից թարթել վերահսկիչի որոնվածը:

Հրամանի առաջին նիշի աջակցվող տատանումներն են.

  • E (Միացնել servo tracking), որն օգտակար է կազմաձևման ընթացքում շարժումը դադարեցնելու համար: Սա մուտքագրվում է ՝ օգտագործելով E0
  • D (Անջատել servo tracking- ը) օգտակար է ավտոմատ հետևումը սկսելու համար, եթե սարքը չվերագործարկվի: Սա մուտքագրվում է ՝ օգտագործելով D0
  • G (Ստացեք կոնֆիգուրացիայի արժեք) կարդում է EEPROM և IN -MEMORY արժեքները.
  • S (Սահմանել EEPROM արժեքը) սահմանում է EEPROM- ի արժեքներ, որոնք հասանելի են վերագործարկումից հետո: Սա մուտքագրվում է ՝ S- ի միջոցով (ինդեքսը վավեր է բայթի 0-13 արժեքների համար, արժեքը վավեր է բայթի արժեքների վրա և տարբերվում է յուրաքանչյուր հատկության համար)

Կոդը ինդեքսների ճշմարտության կետն է, բայց հետևյալը օգտագործվում է վավեր արժեքների/մեկնաբանությունների ուղեցույցի համար.

  • I2C ADDRESS 0 - վերահսկիչի ստրուկի հասցե, վարպետին դա անհրաժեշտ է վերահսկիչի հետ հաղորդակցվելու համար (կանխադրված 10)
  • Նվազագույն ուղղահայաց անկյուն 1 - անկյունային ուղղահայաց servo ստորին սահման (կանխադրված 10, միջակայք 0 - 180)
  • MAXIMUM VERTICAL ANGLE 2 - անկյունային ուղղահայաց servo վերին սահման (կանխադրված 170, միջակայք 0 - 180)
  • SENSITIVITY VERTICAL LDR 3 - ուղղահայաց LDR ընթերցման լուսանցք (կանխադրված 20, միջակայք 0 - 1024)
  • ՎԵՐՏԻԿԱԿԱՆ ԱՆԿՅՈ STՆ ՔԱՅԼ 4 - անկյունային ուղղահայաց servo քայլեր յուրաքանչյուր ճշգրտման վրա (կանխադրված 5, միջակայք 1 - 20)
  • Նվազագույն հորիզոնական անկյուն 5 - անկյունային հորիզոնական servo ստորին սահման (կանխադրված 10, միջակայք 0 - 180)
  • MAXIMUM HORIZONTAL ANGLE 6 - անկյունային հորիզոնական servo վերին սահման (կանխադրված 170, միջակայք 0 - 180)
  • ENգայունության հորիզոնական LDR 7 - հորիզոնական LDR ընթերցման լուսանցք (կանխադրված 20, միջակայք 0 - 1024)
  • ՀՈՐԻZՈՆԱԿԱՆ ԱՆԿՅՈՆ ՔԱՅԼ 8 - անկյունային հորիզոնական servo քայլեր յուրաքանչյուր ճշգրտման վրա (կանխադրված 5, միջակայք 1 - 20)
  • SLEEP MINUTES 9 - հետևելու միջև քնի մոտավոր ժամանակահատվածը (կանխադրված 20, միջակայք 1 - 255)
  • Ա VՅՈՆԱՎԻՏԱԿԱՆ ԱՆԿՅՈ 10Ն 10 - ԱՊԱԳԱՅԻ ՕԳՏԱԳՈՐՈ --Մ - ուղղահայաց անկյունը, որին վերադառնալու է արևը մայր մտնելիս
  • ՀՈՐԻZՈՆԱԹԱՅԻՆ Ա DAՅՈՆԱՅԻՆ 11 - ԱՊԱԳԱՅԻՆ ՕԳՏԱԳՈՐՈ --Մ - արևի մայր մտնելիս հորիզոնական անկյունը վերադառնալու համար
  • ՕԳՆՈԹՅԱՆ ՄԻENՈՈԹՅՈ 12Ն 12 - ԱՊԱԳԱՅԻ ՕԳՏԱԳՈՐՈ --Մ - բոլոր LDR- ների նվազագույն միջին ցուցանիշը, որը խթանում է արևի ամենօրյա հետևման սկիզբը:
  • ՄՈUSՏՔԻ ՄԻENՈՈԹՅՈ 13Ն 13 - ԱՊԱԳԱՅԻ ՕԳՏԱԳՈՐՈ --Մ - բոլոր LDR- ների նվազագույն միջին ցուցանիշը, որը հանգեցնում է արևի ամենօրյա հետևման ավարտի:
  • EEPROM- ի ԱՐUԵՔՆԵՐԻ ՎԵՐ ENDԻՆ ՄԱՐԿԵՐ 14 - ԱՐUEԵՔ ՉԻ ՕԳՏԱԳՈՐՎԱ
  • ԸՆԹԱԻԿ ՄԻENՈՈԹՅՈ 15Ն 15 - լույսի ինտենսիվության ընթացիկ միջին տոկոսը
  • ՀԻՇԱՏԱԿԻ ԱՐUԵՔՆԵՐԻ ՎԵՐ ENDԻՆ ՄԱՐԿԵՐ 16 - ԱՐUEԵՔ ՉԻ ՕԳՏԱԳՈՐՎՈՄ:

Գրավում է սերիական մուտքը (ստեղնաշարի մուտքագրումը վահանակի պատուհանում) և այն փոխանցում է I2C ստրուկին ՝ char, byte, byte ձևաչափով:

#ներառում
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
բուլյան _newData = կեղծ;
const բայթ _numChars = 32;
char _receivedChars [_numChars]; // ստացված տվյալները պահելու զանգված
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
ուշացում (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
ստատիկ բայթ ndx = 0;
char endMarker = '\ n';
char rc;
while (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
եթե (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
եթե (ndx> = _numChars) {
ndx = _numChars - 1;
}
} ուրիշ {
_receivedChars [ndx] = '\ 0'; // դադարեցնել տողը
ndx = 0;
_newData = ճշմարիտ;
}
}
}
voidparseSendCommands () {
եթե (_newData == ճշմարիտ) {
constchar delim [2] = "";
char *նշան;
նշան = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
բայթ ինդեքս = 0;
բայթ արժեքը = 0;
int i = 0;
while (նշան! = NULL) {
//Serial.println (խոսված);
i ++;
անջատիչ (i) {
գործ 1:
նշան = strtok (NULL, delim);
ինդեքս = ատոյ (նշան);
ընդմիջում;
գործ 2:
նշան = strtok (NULL, delim);
եթե (նշան! = NULL) {
արժեք = ատոյ (նշան);
}
ընդմիջում;
կանխադրված:
նշան = NULL;
}
}
sendCmd (cmd, ինդեքս, արժեք);
_newData = կեղծ;
}
}
voidsendCmd (char cmd, բայթ ինդեքս, բայթ արժեք) {
Serial.println ("-----");
Serial.println ("Հրաման ուղարկելը.");
Serial.println ("\ t" + String (cmd) + "" + String (index) + "" + String (value));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // փոխանցել սարքին
Wire.write (cmd); // ուղարկում է նշան
Wire.write (index); // ուղարկում է մեկ բայթ
Wire.write (արժեք); // ուղարկում է մեկ բայթ
Wire.endTransmission ();
բայթ արձագանք = 0;
bool hadResponse = կեղծ;
եթե (cmd == 'G') {
Մետաղալար. Խնդրում ենք (I2C_SLAVE_ADDRESS, 1);
իսկ (Wire.available ()) // ստրուկը կարող է ավելի քիչ ուղարկել, քան պահանջվում է
{
hadResponse = ճշմարիտ;
պատասխան = Wire.read ();
}
եթե (hadResponse == true) {
Serial.println ("Պատասխան ստանալը.");
Serial.println (պատասխան);
} ուրիշ {
Serial.println («Պատասխան չկա, ստուգեք հասցեն/կապը»);
}
}
}

դիտել rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino- ն, որը հյուրընկալվել է it -ի կողմից GitHub- ի կողմից

Քայլ 8: Հաջորդ քայլերը

Պարբերաբար ստուգեք ՝ ծրագրաշարի/սարքաշարի փոփոխությունների համար:

Փոփոխեք ծրագրակազմը/սարքավորումները ձեր պահանջներին համապատասխան:

Մեկնաբանեք ցանկացած խնդրանք/օպտիմալացում:

Խորհուրդ ենք տալիս: