Turinys:

IOT123 - SOLAR TRACKER - CONTROLLER: 8 žingsniai
IOT123 - SOLAR TRACKER - CONTROLLER: 8 žingsniai

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 žingsniai

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 žingsniai
Video: P22 SMART WATCH: Things To Know // Real Life Review 2024, Liepa
Anonim
Image
Image
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER

Tai yra „Instructable“pratęsimas

IOT123 - Saulės stebėjimo priemonė - TILT/PAN, PANELIO RĖMAS, LDR MONTAI RIG. Čia mes sutelkiame dėmesį į servo valdiklį ir saulės padėties jutiklius. Svarbu pažymėti, kad šiame projekte daroma prielaida, kad bus naudojami 2 MCU: vienas (3,3 V 8 MHz „Arduino Pro Mini“) saulės sekikliui ir vienas nepriklausomas MCU jūsų jutikliams/veikėjams.

Tai yra 0.3 versija

Užuot paskelbęs visus projektus po visiško pasitenkinimo, aš praktikuosiu nuolatinę integraciją ir dažniau pristatysiu kažką, keisdamas tai, ką pateikiau, kaip man reikia. Parašysiu kitą instrukciją akumuliatoriaus įkrovikliui, _ kai_ bus baigtas valdiklio programinės įrangos/aparatinės įrangos optimizavimas. Kai tai padarysime, nurodysiu, kur reikia optimizuoti.

Dalis šio požiūrio priežasčių yra klientų atsiliepimai. Jei matote poreikį ar turite geresnį požiūrį, pakomentuokite, tačiau atminkite, kad negaliu visko pristatyti ir galbūt ne iki jums tinkamo laiko. Kadangi šie paaiškinimai atrodo mažiau svarbūs, jie bus ištrinti iš šio straipsnio.

Ką tai apima:

  1. Norėdami nustatyti apytikslę saulės vietą, naudokite originalios instrukcijos LDR.
  2. Perkelkite servo į saulę.
  3. Judesių jautrumo parinktys.
  4. Žingsnio dydžio parinktys judant į saulę.
  5. Servo kampų apribojimų parinktys.
  6. Judėjimo uždelsimo variantai.
  7. I2C sąsaja, skirta nustatyti/gauti reikšmes tarp MCU.
  8. Gilus miegas tarp judesių.

Į tai neįeina (ir bus atsižvelgta kaip leidžiama):

  1. Naudokite maitinimą tik šviesiu paros metu.
  2. Prisimenant aušros padėtį ir einant ten sutemus.
  3. Reguliatoriaus pašalinimas iš MCU.
  4. Šviesos diodo (-ų) išjungimas MCU.
  5. Maitinimo nukreipimas per VCC, o ne RAW.
  6. Siūlomi būdai, kaip mirksėti be reguliuojamos maitinimo iš USB į nuoseklųjį TTL keitiklį.
  7. Akumuliatoriaus įtampos monitorius.

ISTORIJA

2017 m. Gruodžio 20 d. V0.1 KODAS

Pradinė versija seka šviesos šaltinį, visada įjungtą, be įkrovimo

2018 m. Sausio 7 d. V0.2 KODAS

  • Aparatūros pakeitimai

    • Pridėkite I2C kaiščius
    • Pridėkite jungiklį prie servo GND
    • Spausdinta etiketė ant valdiklio dėžutės
  • PROGRAMINĖS ĮRANGOS PAKEITIMAI

    • Skaitykite konfigūraciją iš EEPROM
    • I2C magistralės palaikymas kaip kito MCU vergas (3.3V)
    • Nustatykite konfigūraciją per I2C
    • Nustatykite Įgalinta per I2C
    • Gaukite konfigūraciją per I2C
    • Gaukite veikimo laiko ypatybes per „I2C“(šiuo metu įjungtas ir dabartinis šviesos intensyvumas)
    • Pašalinkite serijinį registravimą (tai paveikė I2C vertes)

2018 m. Sausio 19 d. V0.3 KODAS

  • Aparatūra

    Etiketė atnaujinta. Dabar jungiklis naudojamas pasirinkti CONFIG arba TRACK režimą

  • PROGRAMINĖ ĮRANGA
    • I2C naudojamas tik konfigūravimui
    • Valdiklis laukia 5 sekundes prieš pradėdamas sekti, leidžia judinti rankas
    • Jei norite naudoti I2C konfigūraciją, SPDT turi būti įjungta CONFIG kaip įrenginio įkrova
    • Tarp judėjimo sekimo įrenginys yra gilaus miego režime, kai konfigūracijos vertė SLEEP MINUTES (numatytoji 20 minučių).

1 žingsnis: medžiagos ir įrankiai

Medžiagos ir įrankiai
Medžiagos ir įrankiai
Medžiagos ir įrankiai
Medžiagos ir įrankiai
Medžiagos ir įrankiai
Medžiagos ir įrankiai

Dabar yra visas medžiagų ir šaltinių sąrašas.

  1. 3D spausdintos dalys.
  2. „Arduino Pro Mini 3.3V 8mHz“
  3. 1 iš 4x6 cm dvigubos pusės prototipo PCB universalios spausdintinės plokštės (perpjautos per pusę)
  4. 1 išjungta 40P vyriška antraštė (supjaustoma pagal dydį).
  5. 1 iš 40P moterų antraštė (supjaustoma pagal dydį).
  6. 4 išjungti 10K 1/4 W rezistoriai.
  7. Prijungimo viela.
  8. Lituoklis ir geležis.
  9. 20 išjungti 4G x 6 mm nerūdijančios keptuvės galvutės savisriegius varžtus.
  10. 4 išjungti 4G x 6 mm nerūdijantys savisriegiai varžtai.
  11. 1 išjungta 3,7 V LiPo baterija ir laikiklis (baigiasi 2P dupont jungtimis).
  12. 1 išjungta 2P vyriška stačiakampė antraštė
  13. 1 išjungtas SPDT jungiklis 3 kontaktų 2,54 mm žingsnis
  14. Stiprūs cianakrilato klijai
  15. Dupont jungčių patelė 1P antraštė (1 - mėlyna, 1 - žalia).

2 žingsnis: grandinės surinkimas

Grandinės surinkimas
Grandinės surinkimas
Grandinės surinkimas
Grandinės surinkimas
Grandinės surinkimas
Grandinės surinkimas

Šiuo metu grandinėje nėra įtampos skirstytuvo grandinės (voltmetro).

  1. Perpjaukite 4x6 cm dvigubos pusės prototipo PCB universalios spausdintinės plokštės pusę per visą ilgąją ašį.
  2. Supjaustykite 40P vyrišką antraštę į dalis:

    1. 2 nuo 12 val
    2. 3 išjungta 3P
    3. 6 išjungta 2P.
  3. Supjaustykite 40P moterišką antraštę į gabalus:

    1. 2 nuo 12 val
    2. 1 nuo 6 val
  4. Lituoklis 2 išjungtas 12Pfemale antraštė, kaip parodyta.
  5. Klijuokite tarpiklį, pašalintą iš 3P vyriškos (papildomos) antraštės, ant SPDT jungiklio apačios su cianakrilato klijais
  6. Kitoje pusėje uždėkite lituoti 6 iš 2P, 2 išjungti 3Pmale antraštę ir SPDT jungiklį, kaip parodyta.
  7. Lituokite 4 10K rezistorius (A, B, C, D juodas) per laidą į GND kaiščio antraštę (#2 juoda) ir prie A0 - A3 antgalių kaiščių (#5, #6, #7, #8), tada per skylę (geltona), kaip parodyta (3 nuotraukos + 1 diagrama).
  8. Atsekite 3.3V iš LDR PINS litavimo PINS #4, #6, #8, #10 ir sriegio per skylę iki feamale antraštės VCC kaiščio (žalia).
  9. 3,3 V pėdsako antraštės pusėje, kaip parodyta (raudona), litavimas prie PINS #1, #12, #15.
  10. 3.3V skylė, prilituota prie šoninės (raudonos) RAW antraštės PIN #1.
  11. Atsekite oranžinį sujungimą nuo PIN #11 per skylę iki lydmetalio Moteriškas kaištis kitoje pusėje, kaip parodyta.
  12. Atsekite ir lituokite mėlyną sujungimo laidą nuo #20 iki #30 ir nuo #31 iki #13 ir #16.
  13. Lydmetalis Moteriškos antraštės PIN kodas Nr. 11 į vyriškosios antraštės PIN kodą Nr. 11 per skylę.
  14. Paruoškite 2 30 mm ilgio „dupont“jungtį su 1P antrašte (1 - mėlyna, 1 - žalia). Juostelė ir skarda kitas galas.
  15. Lituoti mėlyną Dupont laidą prie #28; lituoti žalią „Dupont“vielą iki #29.
  16. „Arduino“viršuje pritvirtinkite 6P moterišką antraštę, tada lituokite.
  17. „Arduino“viršuje pritvirtinkite 2P stačiakampę antraštę int #29 ir #30, tada lituokite.
  18. Apatinėje „Arduino“pusėje pritvirtinkite 2 12P ir 1 3P kaiščius, tada lituokite.
  19. Įdėkite „Arduino“vyriškus 12P kaiščius į PCB 12P moterų antraštes.

3 veiksmas: mirksi MCU

Mirksi MCU
Mirksi MCU
Mirksi MCU
Mirksi MCU
Mirksi MCU
Mirksi MCU

„Arduino Pro Mini“patogiai mirksi naudojant FTDI232 USB į TTL keitiklį, naudojant 6P antraštę. Žiūrėkite aukščiau esančią nuotrauką, kad išlygintumėte 2 plokštes.

Įsitikinkite, kad jūsų FTDI232 pasirinktas 3.3V nustatymas. Vykdykite čia pateiktas instrukcijas naudodami žemiau esantį kodą (naudokite nuorodą į GIST).

Turi būti įdiegta mažos galios biblioteka (pridedama ir

Įdėjus „Arduino Pro Mini + PCB“į korpusą, jis vis tiek gali būti mirksintis, kai antraštės kaiščiai yra atviri. Tiesiog atjunkite valdiklį nuo skydo rėmo, atidengdami antraštę.

Pakreipiamas saulės kolektorius su I2C/EEPROM konfigūracija ir miego ciklas tarp judesių. Miego ciklo trukmės tikslumas mažėja didėjant, tačiau pakanka šiam tikslui

/*
* modifikuotas iš kodo
* pateikė Mathiasas Leroy
*
* V0.2 PAKEITIMAI
** I2C SET GET
** GAUTI EEPROM SET
** ŠALINTI SERIJOS IŠVADĄ - Paveikta I2C
** ĮJUNGTI/Neleisti stebėjimo
** PERKELTI PASLAUGAS Į RIBAS I2C
** SKAITYTI DABARTINĮ AVG INTENSITUMĄ I2C
* V0.3 PAKEITIMAI
** PERJUNGTI 2 REŽIMUS - TRACK (NO I2C) ir CONFIGURE (NAUDOJA I2C)
** MIGUOKITE KELIONĖS REŽIMU (LABAI ŽEMA TIKSLUMAS DĖL 8 ANTRŲJŲ ATVYKIŲ)
** DETACH/ATTACH SERVOS ON Miegoti/pabusti (TRANSISTORIUS NAUDOJAMAS NEMOKAMAI)
** Pašalinti sukonfigūruojamą pradinę padėtį (REDUNDANT)
** Pašalinti sukonfigūruojamus žadinimo sekundes (REDUNDANT)
** ŠALINTI KONFIGURUOTINĮ ĮJUNGTI/IŠJUNGTI (REDUNDANT)
** ĮJUNGTAS KONFIGUARUOTAS TRACKERIS (NAUDOTI Aparatūros jungiklį)
** ŠALINA ĮTAMPOS GETTERĮ - NAUDOSI ATSKIRĄ I2C KOMPONENTĄ
** NURODYTI I2C PRIDĖTI SERIJOS ĮREGISTRACIJĄ
*/
#įtraukti
#įtraukti
#įtraukti
#įtraukti
#įtraukti
#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 // visų LDRS vidurkis
#defineIDX_DUSK_INTENSITY13 // visų LDRS vidurkis
#defineIDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // visų LDRS vidurkis - naudojamas IDX_DAWN_INTENSITY aplinkos tiesioginei šviesai apskaičiuoti
#defineIDX_END_VALUES_GET16
#defineIDX_SIGN_117
#defineIDX_SIGN_218
#defineIDX_SIGN_319
Servo _servoH;
Servo _servoV;
baitas _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 _verageTop = 0;
int _averageRight = 0;
int _averageBottom = 0;
int _verageLeft = 0;
baitas _i2cResponse = 0;
bool _inConfigMode = klaidinga;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
if (inConfigMode ()) {
Serial.println („Konfigūracijos režimas“);
Serial.print („I2C adresas:“);
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onRecept (ReceiveEvent);
Wire.onRequest (requestEvent);
}Kitas{
Serial.println („Stebėjimo režimas“);
uždelsimas (5000); // laikas atsitraukti nuo rankų, jei prijungiate akumuliatorių ir pan.
}
}
voidloop ()
{
getLightValues ();
if (! _inConfigMode) {
// Užduotis: ĮJUNGTI TRANZISTORIO JUNGIKLĮ
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
už (int i = 0; i <20; i ++) {
jei (i! = 0) {
getLightValues ();
}
moveServos ();
}
vėlavimas (500);
_servoH.detach ();
_servoV.detach ();
// Užduotis: IŠJUNKITE TRANZISTORIO JUNGIKLĮ
vėlavimas (500);
SleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// --------------------------------- DABARINIS REŽIMAS
boolinConfigMode () {
pinMode (PIN_SERVO_H, INPUT);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
return _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
jei (
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
voidreceptEvent (int count) {
jei (skaičius == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
baitų indeksas = Wire.read ();
baitų reikšmė = Wire.read ();
jungiklis (cmd) {
atvejis „G“:
jei (indeksas <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [indeksas];
}
pertrauka;
atvejis:
if (indeksas <IDX_END_EEPROM_SET) {
_i2cVals [indeksas] = vertė;
EEPROM.update (indeksas, _i2cVals [indeksas]);
}
pertrauka;
numatytas:
grįžti;
}
}
}
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] = žemėlapis (vid. Intensyvumas, 0, 1024, 0, 255);
}
// -------------------------------- SERVOS
voidmoveServos () {
Serial.println ("moveServos");
if ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// eina į kairę
Serial.println („„ moveServos “eina į kairę“);
uždelsimas (_slowingDelay);
(int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
uždelsimas (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// eina teisingai
Serial.println („„ moveServos “eina į kairę“);
uždelsimas (_slowingDelay);
(int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
uždelsimas (_servoLoopDelay);
}
}
Kitas {
// nieko nedaryti
Serial.println ("moveServos nieko nedaro");
uždelsimas (_slowingDelay);
}
if ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// kilti
Serial.println („„ moveServos “kyla“);
uždelsimas (_slowingDelay);
(int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
uždelsimas (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// žemyn
Serial.println („„ moveServos “nusileidžia“);
uždelsimas (_slowingDelay);
(int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
uždelsimas (_servoLoopDelay);
}
}
Kitas {
Serial.println ("moveServos nieko nedaro");
uždelsimas (_slowingDelay);
}
}
// ------------------------------- MIEGA
voidasleepFor (unsignedint eightSecondSegments) {
Serial.println ("miega už");
(unsignedint sleepCounter = eightSecondSegments; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

peržiūrėti rawtilt_pan_tracker_0.3.ino, kurį su „❤“priglobia „GitHub“

4 žingsnis: grandinės korpuso surinkimas

Grandinės korpuso surinkimas
Grandinės korpuso surinkimas
Grandinės korpuso surinkimas
Grandinės korpuso surinkimas
Grandinės korpuso surinkimas
Grandinės korpuso surinkimas
  1. Įsitikinkite, kad „Ardiuno Pro Mini“yra įkištas į PCB antraštes.
  2. Įdėkite SOLAR TRACKER valdiklio dėžutės pagrindą į SOLAR TRACKER valdiklio dėžutės sieneles ir pritvirtinkite 2 išjungtais 4G x 6 mm nerūdijančiais savisriegiais varžtais.
  3. Įdėkite „Ardiuno Pro Mini + PCB“su 6P antraštės anga į SOLAR TRACKER valdiklio dėžutės pagrindo tuštumą.
  4. Įdėkite „SOLAR TRACKER“valdiklio dėžutės dangtelį į „SOLAR TRACKER“valdiklio dėžutės sieneles ir pritvirtinkite 2 išjungtais 4G x 6 mm nerūdijančiais savisriegiais varžtais.
  5. Pritvirtinkite agregatą prie skydo rėmo pagrindo 4 išjungtais 4G x 6 mm nerūdijančiais savisriegiais varžtais.

5 veiksmas: įrenginio laidų prijungimas prie valdiklio

Įrenginio laidų prijungimas prie valdiklio
Įrenginio laidų prijungimas prie valdiklio
Įrenginio laidų prijungimas prie valdiklio
Įrenginio laidų prijungimas prie valdiklio
Įrenginio laidų prijungimas prie valdiklio
Įrenginio laidų prijungimas prie valdiklio

Atitinkamos jungtys, paruoštos iš ankstesnio „Instructable“, yra 4 išjungtos 2P LDR jungtys ir 2 išjungtos 3P jungtys iš servo. Akumuliatorius yra laikinas, kol bus įkrautas. Kol kas naudokite 3,7 V „LiPo“, kuris baigiasi 2P „DuPont“ryšiu.

  1. Įdėkite LDR jungtis (be poliškumo) iš viršaus:

    1. Viršutinis dešinysis
    2. Viršuje kairėje
    3. Apačioje dešinėje
    4. Apačioje kairėje
  2. Įdėkite servo jungtis (su signalo laidu į kairę) iš viršaus:

    1. Horizontalus
    2. Vertikaliai
  3. LAUKITE, KAD PASIRUOSITE BANDYMUI: Įkiškite 3,7 V nuolatinės srovės maitinimo laidą +ve į viršų, -ve iki apačios.

6 veiksmas: valdiklio testavimas

Image
Image

Kaip minėta anksčiau, programinė įranga nebuvo optimizuota saulės energijos įkrovimo darbo eigai. Tačiau jį galima išbandyti ir patobulinti naudojant natūralius (saulės) ir nenatūralius šviesos šaltinius.

Norėdami patikrinti stebėjimą kontroliuojamoje aplinkoje, gali būti patogu nustatyti mažesnę SLEEP MINUTES vertę (žr. Kitą veiksmą).

7 veiksmas: konfigūravimas naudojant „I2C“naudojant konsolės įvestį

Tai paaiškina valdiklio konfigūravimą per antrąjį MCU, nustatymų įvedimą į konsolės langą.

  1. Įkelkite šį scenarijų į „D1M WIFI BLOCK“(arba „Wemos D1 Mini“).
  2. Atjunkite USB nuo kompiuterio
  3. PIN JUNGTYS: -ve (valdiklis) => GND (D1M)+ve (valdiklis) => 3V3 (D1M) SCL (valdiklis) => D1 (D1M)

    SDA (valdiklis) => D2 (D1M)

  4. Pasukite SPDT jungiklį į CONFIG
  5. Prijunkite USB prie kompiuterio
  6. Iš „Arduino IDE“paleiskite konsolės langą su tinkamu COM prievadu
  7. Įsitikinkite, kad pasirinkta „Nauja eilutė“ir „9600 baudų“
  8. Komandos įvedamos į teksto laukelį Siųsti, po to - klavišas Enter
  9. Komandos yra simbolių baitų formato
  10. Jei antrasis baitas (trečias segmentas) neįtrauktas, scenarijus siunčia 0 (nulį)
  11. Būkite atsargūs naudodami nuoseklųjį įvestį; prieš paspausdami „Enter“klavišą peržiūrėkite, ką įvedėte. Jei esate užrakintas (pvz., Pakeisite I2C adresą į vertę, kurią pamiršote), turėsite dar kartą paleisti valdiklio programinę įrangą.

Palaikomi pirmojo komandos simbolio variantai:

  • E (Įjungti servo sekimą) naudinga sustabdyti judėjimą konfigūracijos metu. Tai įvedama naudojant: E 0
  • D (Išjungti servo stebėjimą) naudinga pradėti automatinį stebėjimą, jei neperkraunate įrenginio. Tai įvedama naudojant: D 0
  • G (gauti konfigūracijos vertę) skaito reikšmes iš EEPROM ir IN -MEMORY: tai įvedama naudojant: G (indeksas galioja 0 - 13 ir 15 baitų reikšmėms)
  • S (Nustatyti EEPROM vertę) nustato EEPROM reikšmes, kurios pasiekiamos iš naujo paleidus. Tai įvedama naudojant: S (indeksas galioja nuo 0 iki 13 baitų reikšmių, vertė yra tinkama baitų reikšmė ir skiriasi priklausomai nuo ypatybės)

Kodas yra indeksų tiesos taškas, tačiau toliau pateikiamas galiojančių verčių/komentarų vadovas:

  • I2C ADRESAS 0 - valdiklio pavaldinio adresas, pagrindiniam valdikliui to reikia, kad galėtų bendrauti su valdikliu (numatytasis 10)
  • MINIMALUS VERTIKALUS 1 KAMPAS - apatinė vertikalios servo kampo riba (numatytasis 10, diapazonas 0–180)
  • MAKSIMALUS VERTIKALUS 2 KAMPAS - viršutinė kampo vertikali servo riba (numatytasis 170, diapazonas nuo 0 iki 180)
  • SENSITIVITY VERTICAL LDR 3 - vertikali LDR skaitymo paraštė (numatytoji 20, diapazonas nuo 0 iki 1024)
  • VERTIKALUS KAMPAS 4 ŽINGSNIS - vertikalūs servo žingsniai kiekvienu reguliavimu (numatytasis 5, diapazonas 1–20)
  • MINIMALUS HORIZONTALUS 5 KAMPAS - apatinė kampinė horizontalioji servo riba (numatytasis 10, diapazonas nuo 0 iki 180)
  • MAKSIMALUS HORIZONTALUS 6 KAMPAS - viršutinė kampinė horizontalioji servo riba (numatytasis 170, diapazonas nuo 0 iki 180)
  • SENSITIVITY HORIZONTAL LDR 7 - horizontali LDR skaitymo paraštė (numatytoji 20, diapazonas nuo 0 iki 1024)
  • HORIZONTALUS KAMPAS 8 ŽINGSNIS - horizontalūs servo žingsniai kiekvienu reguliavimu (numatytasis 5, diapazonas 1–20)
  • MIEGIMO MINUTĖS 9 - apytikslis miego laikotarpis tarp stebėjimo (numatytasis 20, diapazonas 1–255)
  • VERTICAL DAWN 10 KAMPAS - ATEITIS NAUDOJIMAS - vertikalus kampas, į kurį reikia grįžti, kai saulė nusileidžia
  • HORIZONTALUS AUKŠTAS 11 KAMPAS - BŪSIMAS NAUDOJIMAS - horizontalus kampas, į kurį reikia grįžti, kai saulė nusileidžia
  • DAWN INTENSITY 12 - BŪSIMAS NAUDOJIMAS - mažiausias visų LDR vidurkis, dėl kurio pradedamas kasdieninis saulės stebėjimas
  • DUSK INTENSITY 13 - BŪSIMAS NAUDOJIMAS - mažiausias visų LDR vidurkis, dėl kurio baigiasi kasdienis saulės stebėjimas
  • 14 EEPROM VERTYBĖS PABAIGA ŽYMĖJAS 14 - Nenaudojama vertė
  • CURTENT INTENSITY 15 - dabartinis vidutinis šviesos intensyvumo procentas
  • ATMINTINĖS VERTYBĖS PABAIGA ŽYMĖTIS 16 - Nenaudojama vertė.

Užfiksuoja nuoseklųjį įvestį (klaviatūros įvestis konsolės lange) ir persiunčia jį I2C vergui char, baitų, baitų formatu

#įtraukti
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
boolean _newData = klaidinga;
const baitas _numChars = 32;
char _receivedChars [_numChars]; // masyvas, skirtas saugoti gautus duomenis
voidsetup () {
Serial.begin (9600);
Viela.pradėti (D2, D1);
vėlavimas (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
statinis baitas ndx = 0;
char endMarker = '\ n';
char rc;
nors (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
if (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
if (ndx> = _numChars) {
ndx = _numChars - 1;
}
} Kitas {
_receivedChars [ndx] = '\ 0'; // nutraukti eilutę
ndx = 0;
_newData = tiesa;
}
}
}
voidparseSendCommands () {
if (_newData == tiesa) {
constchar delim [2] = "";
char *žetonas;
žetonas = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
baitų indeksas = 0;
baitų reikšmė = 0;
int i = 0;
while (žetonas! = NULL) {
//Serial.println(token);
i ++;
jungiklis (i) {
1 atvejis:
žetonas = strtok (NULL, delim);
indeksas = atoi (žetonas);
pertrauka;
2 atvejis:
žetonas = strtok (NULL, delim);
jei (žetonas! = NULL) {
vertė = atoi (žetonas);
}
pertrauka;
numatytas:
žetonas = NULL;
}
}
sendCmd (cmd, indeksas, vertė);
_newData = klaidinga;
}
}
voidsendCmd (char cmd, baitų indeksas, baitų vertė) {
Serial.println ("-----");
Serial.println ("Siuntimo komanda:");
Serial.println ("\ t" + eilutė (cmd) + "" + eilutė (indeksas) + "" + eilutė (vertė));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // perduoti į įrenginį
Wire.write (cmd); // siunčia char
Wire.write (rodyklė); // siunčia vieną baitą
Wire.write (vertė); // siunčia vieną baitą
Wire.endTransmission ();
baitų atsakas = 0;
bool hadResponse = false;
jei (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
o (Wire.available ()) // vergas gali siųsti mažiau nei prašoma
{
hadResponse = tiesa;
atsakymas = Wire.read ();
}
if (hadResponse == true) {
Serial.println ("Gaunamas atsakymas:");
Serial.println (atsakymas);
}Kitas{
Serial.println ("Nėra atsako, patikrinkite adresą/ryšį");
}
}
}

Žiūrėti rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino priglobtas „GitHub“su ❤

8 veiksmas: kiti veiksmai

Periodiškai tikrinkite, ar nėra programinės įrangos/aparatinės įrangos pakeitimų.

Pakeiskite programinę/techninę įrangą pagal savo poreikius.

Komentuokite bet kokias užklausas/optimizavimą.

Rekomenduojamas: