Përmbajtje:

IOT123 - Gjurmues diellor - KONTROLLUES: 8 hapa
IOT123 - Gjurmues diellor - KONTROLLUES: 8 hapa

Video: IOT123 - Gjurmues diellor - KONTROLLUES: 8 hapa

Video: IOT123 - Gjurmues diellor - KONTROLLUES: 8 hapa
Video: Solar-Tracker 3x klein mit Lego, Siemens SPS, Arduino Micro-Controller 2024, Korrik
Anonim
Image
Image
IOT123 - Gjurmues diellor - KONTROLLUES
IOT123 - Gjurmues diellor - KONTROLLUES
IOT123 - Gjurmues diellor - KONTROLLUES
IOT123 - Gjurmues diellor - KONTROLLUES

Kjo është një shtrirje e Instructable

IOT123 - TRACKER SOLAR - TILT/PAN, KUADRI PANEL, LDR MOUNTS RIG. Këtu ne përqëndrohemi në kontrolluesin e servos, dhe sensorët e pozicionit të diellit. Importantshtë e rëndësishme të theksohet se ky dizajn supozon se do të përdoren 2 MCU: një (3.3V 8mHz Arduino Pro Mini) për gjurmuesin diellor dhe një MCU të pavarur për sensorët/aktorët tuaj.

Ky është Versioni 0.3

Në vend që të publikoj të gjitha projektet pas kënaqësisë së plotë, unë do të praktikoj integrim të vazhdueshëm dhe do të ofroj diçka më shpesh, duke modifikuar atë që kam ofruar sipas nevojës. Unë do të shkruaj një udhëzues tjetër për ngarkuesin e baterisë, _ kur_ të ketë përfunduar optimizimi i softverit/harduerit të kontrolluesit. Unë do të theksoj se ku nevojiten optimizimet ndërsa e kalojmë këtë.

Një pjesë e arsyes për këtë qasje janë reagimet e klientëve. Nëse djemtë shihni një nevojë ose keni një qasje më të mirë, ju lutemi komentoni, por mbani në mend se unë nuk mund të ofroj gjithçka dhe ndoshta jo në një afat kohor që ju përshtatet. Meqenëse këto shpjegime duken më pak të rëndësishme, ato do të fshihen nga ky artikull.

Çfarë përfshin kjo:

  1. Përdorni LDR nga Instructable origjinale për të kuptuar vendndodhjen e përafërt të diellit.
  2. Lëvizni servot për t'u përballur me diellin.
  3. Opsionet për ndjeshmërinë e lëvizjeve.
  4. Opsione për madhësinë e hapit kur lëvizni në diell.
  5. Opsionet për kufizimet këndore të përdorura në servos.
  6. Opsionet për vonesat e lëvizjeve.
  7. Ndërfaqja I2C për vendosjen/marrjen e vlerave midis MCU -ve.
  8. Gjumë i thellë midis lëvizjeve.

Çfarë nuk përfshin kjo (dhe do të adresohet si leje kohore):

  1. Përdorimi i energjisë vetëm gjatë orëve të ditës.
  2. Duke kujtuar pozicionin e agimit dhe duke shkuar atje në mbylljen e muzgut.
  3. Heqja e rregullatorit nga MCU.
  4. Çaktivizimi i LED -ve (ve) në MCU.
  5. Rivendosja e energjisë përmes VCC dhe jo RAW.
  6. Sigurimi i zgjidhjeve për ndezje pa energji të rregulluar nga konvertuesi USB në Serial TTL.
  7. Monitorues i tensionit të baterisë.

HISTORIA

20 Dhjetor 2017 V0.1 KOD

Versioni fillestar gjurmon burimin e dritës, gjithmonë i ndezur, pa karikim

7 janar 2018 V0.2 KODI

  • NDRYSHIMET HARDWARE

    • Shtoni kunjat I2C
    • Shtoni ndërprerës në servo GND
    • Etiketë e Shtypur në magjinë e kutisë së kontrolluesit
  • NDRYSHIMET E SOFTUERIT

    • Lexoni konfigurimin nga EEPROM
    • Mbështetja e autobusit I2C si skllav i një MCU tjetër (3.3V)
    • Vendosni konfigurimin përmes I2C
    • Cilësimi i aktivizuar përmes I2C
    • Merrni konfigurimin përmes I2C
    • Merrni pronat e ekzekutimit përmes I2C (Aktualisht të Aktivizuara, dhe Intensiteti aktual i dritës)
    • Hiq regjistrimet serike (ndikoi në vlerat e I2C)

19 janar 2018 V0.3 KODI

  • HARDWARE

    Etiketa u përditësua. Switch tani përdoret për të zgjedhur modalitetin CONFIG ose TRACK

  • SOFTWARE

    • I2C përdoret vetëm për konfigurim
    • Kontrolluesi pret 5 sekonda para fillimit të gjurmimit, lejon lëvizjen e duarve
    • Për të përdorur konfigurimin I2C, SPDT duhet të jetë në CONFIG si njësi çizme
    • Në mes të gjurmimit të lëvizjes, njësia është në gjendje gjumi të thellë për vlerën e konfigurimit SLEEP MINUTES (parazgjedhje 20 minuta).

Hapi 1: Materialet dhe Mjetet

Materialet dhe Mjetet
Materialet dhe Mjetet
Materialet dhe Mjetet
Materialet dhe Mjetet
Materialet dhe Mjetet
Materialet dhe Mjetet

Tani ekziston një listë e plotë e Faturave të Materialeve dhe Burimeve.

  1. Pjesë të printuara 3D.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 prej 4x6cm Prototip dopio anësor PCB Universal Printed Circuit Board (do të pritet përgjysmë)
  4. 1 kokë meshkuj 40P (për tu prerë në madhësi).
  5. 1 kokë femër 40P (për tu prerë në madhësi).
  6. 4 off restors 10K 1/4W.
  7. Teli lidhës.
  8. Solder dhe Hekuri.
  9. 20 vida 4G x 6mm me kokë tavani prej çeliku të vetë -përgjimit.
  10. 4 vida 4G x 6mm të pandryshkshme të vetë -përgjimit.
  11. 1 bateri dhe mbajtëse 3.7V LiPo (përfundon në lidhëset dupont 2P).
  12. 1 kokë kokë me kënd të drejtë mashkullor 2P
  13. 1 çelës SPDT me 3 pika katran 2.54mm
  14. Ngjitës i fortë Cyanoacrylate
  15. Lidhëset Dupont femra 1P kokë (1 me ngjyrë blu, 1 me ngjyrë jeshile).

Hapi 2: Montimi i qarkut

Montimi i Qarkut
Montimi i Qarkut
Montimi i Qarkut
Montimi i Qarkut
Montimi i Qarkut
Montimi i Qarkut

Qarku aktualisht nuk ka Qarkun e Ndarjes së Tensionit (voltmetër).

  1. Pritini Bordin e Qarkut të Shtypur Universal të Prototipit PCB Universal të Printuar 4x6cm përgjysmë përgjatë boshtit të gjatë.
  2. Pritini kokën mashkullore 40P në copa:

    1. 2 me 12 p
    2. 3 zbritje 3P
    3. 6 zbritje në 2P.
  3. Pritini kokën femër 40P në copa:

    1. 2 me 12 p
    2. 1 nga 6 p
  4. Ngjitës 2 me kokë 12Femërore siç tregohet.
  5. Ngjiteni ndarësin e hequr nga një kokë 3P mashkullore (shtesë) në pjesën e poshtme të çelësit SPDT me ngjitës cianoakrilat
  6. Në anën tjetër lidhni më pas 6 nga 2P, 2 nga 3Publetë mashkullore dhe çelësin SPDT siç tregohet.
  7. Ngjitni 4 rezistenca 10K (A, B, C, D e zezë) përmes plumbit në kokën e kokës GND (#2 e zezë) dhe në kunjat e kokës A0 - A3 (#5, #6, #7, #8) pastaj përmes vrimës (e verdhë) siç tregohet (3 fotografi + 1 diagram).
  8. Gjurmoni 3.3V nga PIN -et e saldimit të PIN -ve LDR #4, #6, #8, #10 dhe kaloni nëpër vrimën e kunjave VCC të kokës feamale (jeshile).
  9. Gjurmoni 3.3V në kokën e femrës siç tregohet (e kuqe) duke u bashkuar me PINS #1, #12, #15.
  10. 3.3V përmes vrimës së bashkuar nga ana tjetër (e kuqe) PIN -i i kokës RAW #1.
  11. Gjurmoni lidhjen portokalli nga PIN #11 përmes vrimës për të ngjitur kunjat Femra në anën tjetër siç tregohet.
  12. Gjurmoni dhe lidhni telin blu të lidhjes nga #20 në #30 dhe nga #31 në #13 dhe #16.
  13. PIN PIN #11 i kokës Femër të bashkuar në PIN të kokës Mashkull #11 përmes vrimës.
  14. Përgatitni 2 lidhës dupont 30 mm të gjatë me kokë femër 1P (1 me ngjyrë blu, 1 me ngjyrë jeshile). Rrip dhe kallaj në anën tjetër.
  15. Ngjitës tela blu Dupont në numrin 28; lidhni telin e gjelbër Dupont në numrin 29.
  16. Në pjesën e sipërme të Arduino fiksojeni kokën e femrës 6P pastaj lidhni.
  17. Në pjesën e sipërme të Arduino fiksoni kokën femërore me kënd të drejtë 2P int #29 dhe #30 pastaj lidhni.
  18. Në pjesën e poshtme të Arduino fiksojini 2 kunjat mashkullore 12P dhe 1 off 3P pastaj lidhini.
  19. Futni kunjat Arduino mashkullore 12P në titujt femra të PCB 12P.

Hapi 3: Ndezja e MCU

Duke ndezur MCU
Duke ndezur MCU
Duke ndezur MCU
Duke ndezur MCU
Duke ndezur MCU
Duke ndezur MCU

Arduino Pro Mini është ndezur në mënyrë të përshtatshme duke përdorur një konvertues FTDI232 USB në TTL duke përdorur kokën femër 6P. Shihni foton më lart për shtrirjen e 2 dërrasave.

Sigurohuni që cilësimi 3.3V të jetë zgjedhur në FTDI232 tuaj. Ndiqni udhëzimet këtu duke përdorur kodin më poshtë (përdorni lidhjen për GIST).

Biblioteka me fuqi të ulët (bashkangjitur dhe https://github.com/rocketscream/Low-Power) duhet të instalohet.

Pasi të jetë instaluar PCB Arduino Pro Mini + në kasë, ajo ende mund të ndizet ndërsa kunjat e kokës janë të ekspozuara. Thjesht shkëputni Njësinë e Kontrolluesit nga Korniza e Panelit duke ekspozuar kokën.

Gjurmues diellor me pjerrësi të pjerrët me konfigurim I2C/EEPROM dhe cikël gjumi midis lëvizjeve. Kohëzgjatja e ciklit të gjumit saktësia zvogëlohet me rritjen e kohëzgjatjes, por e mjaftueshme për këtë qëllim

/*
* modifikuar nga kodi
* nga Mathias Leroy
*
* V0.2 MODIFIKIMET
** I2C SET MERRNI
** EEPROM SET MERRNI
** Hiqni daljen seriale - të ndikuar nga I2C
** ÇAJTIM/ZGJIDHJE E PAKTUESHME
** Lëvizni shërbimet në kufijtë përmes I2C
** LEXONI INTENSITETIN AVG AKTUAL VIA I2C
* V0.3 MODIFIKIMET
** KALIM P FORR 2 MONDE - TRACK (JO I2C) dhe KONFIGURIM (PESRDORON I2C)
** FLENI ND MDNYR TRN E RRUGS (PRECISION SHUM I ULT PR shkak të 8 copave të dyta)
** DETACH/ATTACH SERVOS N S FLET/WAKIR (TRANSISTORI P USRDORET NGA EVENTUALISHT)
** Hiq Pozicionin Fillestar të Konfigurueshëm (REDUNDANT)
** Hiq sekondat e konfigurueshme të zgjimit (të tepërta)
** HIQENI TF KONFIGURUESHME TNA FUNDSUAR/PAKTUAR (PEDRFUNDUES)
** HIQONI NDACRGJEGJSIN E KONFIGURUESH (M T (KONFIGURUESH (M (PERDOR PWRDORIMIN E HARDWARE SWITCH)
** Hiqni tensionin - do të përdorni një komponent të ndarë I2C
** SHTO LOGOHJE SERIALE KUR NUK PINGRDORNI I2C
*/
#përfshi
#përfshi
#përfshi
#përfshi
#përfshi
#përcaktoEEPROM_VERSION1
#përcaktoI2C_MSG_IN_SIZE3
#përcaktoPIN_LDR_TL A0
#përcaktoPIN_LDR_TR A1
#përcaktoPIN_LDR_BR A3
#përcaktoPIN_LDR_BL A2
#përcaktoPIN_SERVO_V11
#përcaktoPIN_SERVO_H5
#defineIDX_I2C_ADDR0
#përcaktoIDX_V_ANGLE_MIN1
#përcaktoIDX_V_ANGLE_MAX2
#përcaktoIDX_V_SENSITIVITY3
#defineIDX_V_STEP4
#përcaktoIDX_H_ANGLE_MIN5
#përcaktoIDX_H_ANGLE_MAX6
#defineIDX_H_SENSITIVITY7
#përcaktoIDX_H_STEP8
#defineIDX_SLEEP_MINUTES9
#përcakto IDX_V_DAWN_ANGLE10
#defineIDX_H_DAWN_ANGLE11
#defineIDX_DAWN_INTENSITY12 // mesatarja e të gjitha LDRS
#defineIDX_DUSK_INTENSITY13 // mesatarja e të gjitha LDRS
#përcakto IDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // mesatarja e të gjitha LDRS - përdoret për llogaritjen e dritës ambjente jo të drejtpërdrejtë të IDX_DAWN_INTENSITY
#përcakto IDX_END_VALUES_GET16
#përcakto IDX_SIGN_117
#përcakto IDX_SIGN_218
#përcakto IDX_SIGN_319
Servo _servoH;
Servo _servoV;
byte _i2cVals [20] = {10, 10, 170, 20, 5, 10, 170, 20, 5, 20, 40, 10, 30, 40, 0, 0, 0, 0, 0, 0};
int _servoLoopVonesë = 10;
int _slowingDelay = 0;
int _angleH = 90;
int _angleV = 90;
int _averageTop = 0;
int _averageRight = 0;
int _averageBottom = 0;
int _averageLeft = 0;
byte _i2cResponse = 0;
bool _inConfigMode = false;
voidsetup ()
{
Serial.fillo (115200);
getFromEeprom ();
nëse (inConfigMode ()) {
Serial.println ("Mënyra e konfigurimit");
Serial.print ("Adresa I2C:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (merrniEvent);
Wire.onRequest (requestEvent);
} tjetër {
Serial.println ("Mënyra e Ndjekjes");
vonesë (5000); // koha për të hequr dorë nga rruga nëse lidhni baterinë etj.
}
}
voidloop ()
{
getLightValues ();
nëse (! _inConfigMode) {
// ToDo: HYRJE ÇELWSIN E TRANSISTORIT
_servoH.tash (PIN_SERVO_H);
_servoV.tash (PIN_SERVO_V);
për (int i = 0; i <20; i ++) {
nëse (i! = 0) {
getLightValues ();
}
moveServos ();
}
vonesë (500);
_servoH.detach ();
_servoV.detach ();
// ToDo: FIK OF FIKSIMIN E TRANSISTORIT
vonesë (500);
në gjumëFor ((_ _ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// --------------------------------- MDNYRA AKTUALE
boolinConfigMode () {
pinMode (PIN_SERVO_H, INPUT);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
kthimi _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
nëse (
EEPROM.lexo (IDX_SIGN_1)! = 'S' ||
EEPROM.lexo (IDX_SIGN_2)! = 'T' ||
EEPROM.lexo (IDX_SIGN_3)! = EEPROM_VERSION
) EEPROM_write_default_configuration ();
EEPROM_read_configuration ();
}
voidEEPROM_write_default_configuration () {
Serial.println ("EEPROM_write_default_configuration");
për (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
EEPROM.ditëso (i, _i2cVals );
}
EEPROM.ditësim (IDX_SIGN_1, 'S');
EEPROM.ditësim (IDX_SIGN_2, 'T');
EEPROM.ditësim (IDX_SIGN_3, EEPROM_VERSION);
}
voidEEPROM_read_configuration () {
Serial.println ("EEPROM_read_configuration");
për (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.lexo (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
nëse (numëroni == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
indeksi i bajtit = Wire.read ();
vlera e bajtit = Wire.read ();
kaloni (cmd) {
rasti 'G':
nëse (indeksi <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [indeksi];
}
pushim;
rasti 'S':
nëse (indeksi <IDX_END_EEPROM_SET) {
_i2cVals [indeksi] = vlera;
EEPROM.ditë (indeksi, _i2cVals [indeksi]);
}
pushim;
parazgjedhje:
kthim;
}
}
}
kërkesë e pavlefshme Event ()
{
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] = hartë (mesatarja e intensitetit, 0, 1024, 0, 255);
}
// --------------------------------- SERVOS
voidmoveServos () {
Serial.println ("moveServos");
nëse ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// duke shkuar majtas
Serial.println ("moveServos shkon majtas");
vonesë (_slowingDelay);
për (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.shkruaj (_angleH--);
vonesë (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// duke shkuar drejtë
Serial.println ("moveServos shkon majtas");
vonesë (_slowingDelay);
për (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.shkruaj (_angleH ++);
vonesë (_servoLoopDelay);
}
}
tjeter {
// duke bërë asgjë
Serial.println ("moveServos duke bërë asgjë");
vonesë (_slowingDelay);
}
nëse ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// duke shkuar lart
Serial.println ("moveServos going up");
vonesë (_slowingDelay);
për (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
vonesë (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// duke shkuar poshte
Serial.println ("moveServos going down");
vonesë (_slowingDelay);
për (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
vonesë (_servoLoopDelay);
}
}
tjeter {
Serial.println ("moveServos duke bërë asgjë");
vonesë (_slowingDelay);
}
}
// -------------------------------- FLEJ
voidasleepFor (pa shenjë tetëSecondSegmente) {
Serial.println ("në gjumëPër");
për (gjumi i panënshkruarCounter = tetëSecondSegmente; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

shikoni rawtilt_pan_tracker_0.3.ino të hostuar me ❤ nga GitHub

Hapi 4: Montimi i zorrës së qarkut

Montimi i zorrës së qarkut
Montimi i zorrës së qarkut
Montimi i zorrës së qarkut
Montimi i zorrës së qarkut
Montimi i zorrës së qarkut
Montimi i zorrës së qarkut
  1. Sigurohuni që Ardiuno Pro Mini të futet në titujt në PCB.
  2. Vendosni bazën e kutisë së kontrolluesit SOLAR TRACKER në muret e kutisë së kontrolluesit SOLAR TRACKER dhe ngjiteni me 2 vida 4 fikse 4G x 6mm të pandryshkshme të vetë -përgjimit.
  3. Fut Ardiuno Pro Mini + PCB me 6P Header të çarë në zbrazëti në bazën e kutisë së kontrolluesit SOLAR TRACKER.
  4. Vendosni kapakun e kutisë së kontrolluesit SOLAR TRACKER në muret e kutisë së kontrolluesit SOLAR TRACKER dhe ngjiteni me 2 vida 4 fikse 4G x 6mm të kundër -zhytura të vetë -përgjimit.
  5. Vendoseni montimin sipër në bazën e Kornizës së Panelit me 4 vida 4G x 6mm inox të kundërsulmuara të vetë -përgjimit.

Hapi 5: Lidhja e drejtuesve të pajisjeve me kontrolluesin

Lidhja e drejtuesve të pajisjeve me kontrolluesin
Lidhja e drejtuesve të pajisjeve me kontrolluesin
Lidhja e drejtuesve të pajisjeve me kontrolluesin
Lidhja e drejtuesve të pajisjeve me kontrolluesin
Lidhja e drejtuesve të pajisjeve me kontrolluesin
Lidhja e drejtuesve të pajisjeve me kontrolluesin

Lidhjet përkatëse të gatshme nga Instructable e mëparshme, janë 4 lidhje 2P LDR dhe 2 lidhje 3P nga servos. Ajo që është e përkohshme derisa rimbushja të jetë gati është bateria. Përdorni një LiPo 3.7V që përfundon në një lidhje 2P DuPont tani për tani.

  1. Futni lidhjet LDR (pa polaritet) nga lart:

    1. Lart djathtas
    2. Majtas lart
    3. Poshtë djathtas
    4. Poshtë majtas
  2. Futni lidhjet Servo (me tela sinjali në të majtë) nga lart:

    1. Horizontale
    2. Vertikale
  3. PRIT DERI Gati për provë PASTAJ: Futni prizën 3.7V DC Power +ve në krye, -ve në fund.

Hapi 6: Testimi i kontrolluesit

Image
Image

Siç u tha më parë, softueri nuk është optimizuar për rrjedhën e punës të Ngarkimit Diellor. Mund të testohet dhe ndryshohet duke përdorur burime drite natyrale (dielli) dhe të panatyrshme.

Për të testuar gjurmimin në një mjedis të kontrolluar, mund të jetë i përshtatshëm vendosja e MINUTAVE SLEEP në një vlerë më të ulët (shiko hapin tjetër).

Hapi 7: Konfigurimi përmes I2C duke përdorur hyrjen e tastierës

Kjo shpjegon konfigurimin e kontrolluesit përmes një MCU të dytë, duke futur cilësimet në një dritare të tastierës.

  1. Ngarko skriptin e mëposhtëm në një D1M WIFI BLOCK (ose Wemos D1 Mini).
  2. Shkëputeni USB -në nga kompjuteri
  3. LIDHJET PIN: -ve (Kontrollues) => GND (D1M)+ve (Kontrollues) => 3V3 (D1M) SCL (Kontrollues) => D1 (D1M)

    SDA (Kontrolluesi) => D2 (D1M)

  4. Kthejeni çelësin SPDT në CONFIG
  5. Lidhni USB me PC
  6. Nga Arduino IDE filloni një dritare të tastierës me Portën e duhur COM
  7. Sigurohuni që të jenë zgjedhur "Newline" dhe "9600 baud"
  8. Komandat futen në Dërgo Kutinë e Tekstit e ndjekur nga tasti Enter
  9. Komandat janë në formatin Bajti i karaktereve
  10. Nëse bajti i dytë (segmenti i tretë) nuk është përfshirë 0 (zero) dërgohet nga skripti
  11. Kini kujdes duke përdorur hyrje serike; rishikoni atë që keni futur para se të shtypni butonin "Enter". Nëse jeni të kyçur (për shembull duke ndryshuar adresën I2C në një vlerë që keni harruar) do t'ju duhet të ndizni përsëri firmware -in e kontrolluesit.

Variacionet e mbështetura në karakterin e parë të komandës janë:

  • E (Aktivizo përcjelljen servo) e dobishme për ndalimin e lëvizjes gjatë konfigurimit. Kjo futet duke përdorur: E 0
  • D (Çaktivizo përcjelljen servo) e dobishme për të filluar gjurmimin automatik nëse nuk rindiz pajisjen. Kjo futet duke përdorur: D 0
  • G (Merr vlerën e konfigurimit) lexon vlerat nga EEPROM dhe IN -MEMORY: Kjo futet duke përdorur: G (indeksi është i vlefshëm vlerat e bajtit 0 - 13 dhe 15)
  • S (Vendos vlerën EEPROM) vendos vlera në EEPROM të cilat janë të disponueshme pas rindezjes. Kjo futet duke përdorur: S (indeksi është vlerë e vlefshme e bajtit 0 - 13, vlera është vlerë e vlefshme e bajtit dhe ndryshon për vetinë)

Kodi është pika e së vërtetës për indekset, por në vijim përdoret për një udhëzues për vlerat/komentet e vlefshme:

  • I2C ADRESA 0 - adresa e skllavit të kontrolluesit, masterit i duhet kjo për të komunikuar me kontrolluesin (parazgjedhja 10)
  • KGNDI MINIMUM VERTIKAL 1 - kufiri i poshtëm i servo vertikal i këndit (i parazgjedhur 10, diapazoni 0 - 180)
  • KGNDI MAXIMUM VERTIKAL 2 - kufiri i sipërm i servo vertikal i këndit (parazgjedhur 170, diapazoni 0 - 180)
  • SENSITIVITETI LDR VERTIKAL 3 - Diferenca vertikale e leximit të LDR (e parazgjedhur 20, diapazoni 0 - 1024)
  • KGNDI VERTIKAL HAPI 4 - hapa servo vertikale me kënd në çdo rregullim (parazgjedhje 5, diapazoni 1 - 20)
  • KGNDI MINIMUM HORIZONTAL 5 - kufiri i poshtëm i servo horizontale me kënd (i parazgjedhur 10, diapazoni 0 - 180)
  • KGNDI MAXIMUM HORIZONTAL 6 - kufiri i sipërm i servo horizontale i këndit (parazgjedhur 170, diapazoni 0 - 180)
  • Sensibiliteti LDR HORIZONTAL 7 - Diferenca e leximit LDR horizontale (e parazgjedhur 20, diapazoni 0 - 1024)
  • HAPI HORIZONTAL HAPI 8 - hapa servo horizontale servo në çdo rregullim (parazgjedhje 5, diapazoni 1 - 20)
  • SLEEP MINUTES 9 - periudha e përafërt e gjumit midis gjurmimit (parazgjedhja 20, diapazoni 1 - 255)
  • KGNDI VARTIKAL I AUTIT 10 - P USRDORIMI I ARDHSHME - këndi vertikal për tu kthyer kur perëndon dielli
  • KGNDI HORIZONTAL I Agimit 11 - P USRDORIMI I ARDHSHME - këndi horizontal për t'u kthyer kur perëndon dielli
  • Intensiteti i Agimit 12 - P USRDORIMI I ARDHSHME - mesatarja minimale e të gjitha LDR -ve që shkakton fillimin e përcjelljes ditore të diellit
  • Intensiteti i errësirës 13 - P USRDORIMI I ARDHMS - mesatarja minimale e të gjitha LDR -ve që shkakton përfundimin e përcjelljes ditore të diellit
  • P ENDRFUNDIMI I VLERAVE T E EEPROM MARKER 14 - VLERA NUK P USRDORET
  • Intensiteti aktual 15 - përqindja mesatare aktuale e intensitetit të dritës
  • P ENDRFUNDIMI I VLERAVE P -R PEMRKUJTSORE SH MNIMI 16 - VLERA NUK P USRDORET.

Regjistron hyrjen serike (hyrja e tastierës në dritaren e tastierës) dhe e përcjell atë në një skllav I2C në formatin char, bajt, bajt

#përfshi
#përcaktoI2C_MSG_IN_SIZE2
#përcaktoI2C_MSG_OUT_SIZE3
#përcaktoI2C_SLAVE_ADDRESS10
boolean _newData = false;
const byte _numChars = 32;
char _receivedChars [_numChars]; // një grup për të ruajtur të dhënat e marra
voidsetup () {
Serial.filloj (9600);
Wire.begin (D2, D1);
vonesa (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
bajt statik ndx = 0;
char endMarker = '\ n';
char rc;
ndërsa (Serial. i disponueshëm ()> 0 && _newData == false) {
rc = Serial.read ();
nëse (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
nëse (ndx> = _numChars) {
ndx = _numriChars - 1;
}
} tjetër {
_receivedChars [ndx] = '\ 0'; // përfundoni vargun
ndx = 0;
_newData = e vërtetë;
}
}
}
voidparseSendCommands () {
nëse (_newData == e vërtetë) {
konstrukt delim [2] = "";
shenjë char *;
shenjë = strtok (_pranoiChars, delim);
char cmd = _pranuarChars [0];
indeksi i bajtit = 0;
vlera e bajtit = 0;
int i = 0;
ndërsa (shenjë! = NULL) {
//Serial.println (e thënë);
i ++;
kaloni (i) {
rasti 1:
token = strtok (NULL, delim);
indeks = atoi (shenjë);
pushim;
rasti 2:
token = strtok (NULL, delim);
nëse (shenjë! = NULL) {
vlera = atoi (shenjë);
}
pushim;
parazgjedhje:
shenjë = NULL;
}
}
sendCmd (cmd, indeksi, vlera);
_newData = false;
}
}
voidsendCmd (char cmd, indeksi i bajtit, vlera e bajtit) {
Serial.println ("-----");
Serial.println ("Dërgimi i komandës:");
Serial.println ("\ t" + varg (cmd) + "" + varg (indeks) + "" + varg (vlerë));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // transmetoni në pajisje
Tela.shkruaj (cmd); // dërgon një shenjë
Wire.write (indeksi); // dërgon një bajt
Wire.write (vlera); // dërgon një bajt
Wire.endTransmission ();
përgjigje byte = 0;
bool hadResponse = false;
nëse (cmd == 'G') {
Tela. KërkohetNga (I2C_SLAVE_ADDRESS, 1);
ndërsa (Wire.available ()) // skllavi mund të dërgojë më pak se sa kërkohet
{
hadResponse = e vërtetë;
përgjigje = Wire.read ();
}
nëse (hadResponse == e vërtetë) {
Serial.println ("Marrja e përgjigjes:");
Serial.println (përgjigje);
} tjetër {
Serial.println ("Asnjë përgjigje, kontrolloni adresën/lidhjen");
}
}
}

shiko rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino pritur me ❤ nga GitHub

Hapi 8: Hapat e ardhshëm

Kontrolloni periodikisht për të kontrolluar ndryshimet në softuer/harduer.

Ndryshoni softuerin/harduerin sipas kërkesave tuaja.

Komentoni çdo kërkesë/optimizim.

Recommended: