Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   440 / 852
(#) devilke3000 válasza tbarath hozzászólására (») Márc 27, 2018 /
 
Ezt én is látom google nem talál semmit róla...
(#) tbarath válasza devilke3000 hozzászólására (») Márc 27, 2018 /
 
Mit kellene találnia? Visszaadja a puffer üres (fel nem használt) karaktereinek a számát.
(#) kapu48 válasza devilke3000 hozzászólására (») Márc 27, 2018 /
 
Ebben a projectben azt valósították meg, amit te szeretnél!
Connecting Arduino to Processing
Bővebben: Link

Ebben a bemutatóban megtanuljuk:

Hogyan küldjünk adatokat az Arduino-ból a feldolgozáshoz a soros porton keresztül
Hogyan lehet adatokat fogadni az Arduino-tól a feldolgozásban?
Hogyan küldjünk adatokat a feldolgozásról az Arduino-ra
Hogyan lehet adatokat fogadni az Arduino feldolgozásáról?
Hogyan írhatunk soros "kézfogást" az Arduino és a Feldolgozás között az adatáramlás szabályozásához
A hozzászólás módosítva: Márc 27, 2018
(#) Kotesz hozzászólása Márc 28, 2018 /
 
Sziasztok

Egy SIM800l modult szeretnék hívással feléleszteni és azonosítani a hívót!
  1. String buffer1;
  2. unsigned int current_millis = 0;
  3. String phone;
  4.  
  5. void setup() {
  6.      buffer1.reserve(200);
  7.      phone.reserve(20);
  8.  
  9.      Serial.begin(19200); //
  10.      SIM800.begin(9600);
  11.      delay(1000);
  12.      SIM800.write("AT\r");  
  13.      delay(1000);
  14.      SIM800.write("AT+IPR=9600\r");  
  15.      
  16.      delay(1000);
  17.      SIM800.write("AT+CMGF=1\r");  
  18.      delay(1000);
  19.      SIM800.write("AT+CNMI=2,2,0,0,0\r");
  20.      delay(1000);
  21.      Serial.print(SIM800.readString());
  22.      SIM800.write("AT+CLIP=1\r\n");
  23.      delay(1000);
  24.      SIM800.write("AT+SGPIO=0,7,1,0\r");
  25.      delay(1000);
  26.      SIM800.write("AT+CSCLK=2\r");
  27.      delay(1000);
  28.      current_millis = millis();
  29. }
  30.  
  31. void loop() {
  32.    
  33.    if (SIM800.available() > 0) {
  34.       buffer1 = SIM800.readStringUntil('\n');
  35.            caller number from it
  36.       Serial.println(buffer1);
  37.       parse();
  38.       current_millis = millis();
  39.       }
  40.  
  41.     if ((millis() - current_millis) > 10000) {
  42.        sleepNow();
  43.        delay(1000);// tried many delays
  44.        current_millis = millis();
  45.      }
  46.  
  47.  }
  48.  
  49. void parse() {
  50.     if (buffer1.indexOf("CLIP:") > 0) {
  51.         phone = buffer1.substring(buffer1.indexOf("+CLIP: ") + 8,
  52.         buffer1.indexOf("+CLIP: ") + 21);
  53.         Serial.println(phone);
  54.         SIM800.write("ATH\r");
  55.         delay(500);
  56.         SIM800.write("ATH\r");
  57.         delay(500);
  58.   }
  59.  
  60. }
  61.  
  62. void sleepNow() {
  63.     set_sleep_mode(SLEEP_MODE_PWR_DOWN);  
  64.     sleep_mode();              
  65.     sleep_disable();        
  66.     }


A fenti kód működik de egy igen zavaró probléma adódik a kb. 3-4 hívás után.
A modul feléledésekor értelmetlen nem ovasható karakterek érkeznek a modul felől.
És így már nem lehet kiolvasni a hívó számát.
Mit lehet tenni ilyenkor?
(#) Baxi válasza nedudgi hozzászólására (») Márc 28, 2018 /
 
Szia, igen köszönöm .
(#) Bakman válasza Kotesz hozzászólására (») Márc 29, 2018 /
 
Kósza ötlet: Hívás után újraindítani a modult?
(#) devilke3000 hozzászólása Ápr 1, 2018 /
 
constrain limitet használnék de constrain(month, 0, 12); engedi pl 99 is!
  1. else if(serial_buffer[0] == '!' && serial_buffer[1] == 'T') {
  2.  
  3.         String time_string = String(serial_buffer);
  4.  
  5. int year = constrain(year, 2000, 2090);
  6. int month = constrain(month, 0, 12);
  7. int day = constrain(day, 0, 31);
  8. int hour = constrain(hour, 0, 23);
  9. int minute = constrain(minute, 0, 59);
  10. int second = constrain(second, 0, 59);
  11.          year = time_string.substring(2, 6).toInt();
  12.          month = time_string.substring(6, 8).toInt();        
  13.          day = time_string.substring(8, 10).toInt();
  14.           hour = time_string.substring(10, 12).toInt();
  15.          minute = time_string.substring(12, 14).toInt();
  16.          second = time_string.substring(14, 16).toInt();
  17.        DateTime set_time = DateTime(year, month, day, hour, minute, second);
(#) tbarath válasza devilke3000 hozzászólására (») Ápr 1, 2018 /
 
Tehát azt mondod, hogy az
  1. int month = constrain(99, 0, 12);
után közvetlenül a month változót kiiratva 99-et kapsz?
A hozzászólás módosítva: Ápr 1, 2018
(#) devilke3000 válasza tbarath hozzászólására (») Ápr 1, 2018 /
 
igy jolet...

  1. byte month = constrain(time_string.substring(6, 8).toInt(), 1, 12)
(#) HiMen hozzászólása Ápr 4, 2018 /
 
Arduinosok, kérlek segítsetek!
Egy AD7715 SPI buszos A/D konvertert kell kiolvasnom, de nem megy. Hogy az áramkör hibát kiküszöböljem kipróbáltam BS2SX mikrovezérlővel , amivel tökéletesen működik. Ugyan erre bekötöm az ARDUINO UNO-t és nem megy. Tehát az áramkör jó, a programmal lesz a gond.
Ide teszem mindkét programot.

- Igazából nem értem hol van definiálva, hogy az arduino SPI.h könyvtár utasításai a 13-11 lábakat használják, de mivel a mintaprogramokban sincs ez beállítva, ezért én is ezekhez kötöttem. Tényleg hol van ez leírva, mert az arduino reference -ben sem találok rá utalást?!
- Igen tudom , hogy nem kell minden olvasás előtt beállítani az x10 x68 setupot, de a BS2-vel így is működik, tehát nem ez a probléma.

BS2SX program (ami működik):

  1. DOUT        CON 2
  2. DIN         CON 3
  3. SCL         CON 4
  4.  
  5. RES         CON 6
  6.  
  7. adat       VAR Word
  8.  
  9. OUTPUT SCL
  10. OUTPUT DIN
  11. OUTPUT RES
  12. INPUT  DOUT
  13.  
  14. HIGH scl
  15. LOW RES
  16.  
  17. PAUSE 500
  18.  
  19. HIGH RES
  20.  
  21. ujra:
  22. PAUSE 500
  23.  
  24. SHIFTOUT DIN,SCL,MSBFIRST,[%00010000]  '$10 gain, standby, következő is setup
  25. SHIFTOUT DIN,SCL,MSBFIRST,[%00101000] '$68 bipolar mode, buffe off, no filter sync, 2,4576, 60Hz, self calibration
  26.  
  27. PAUSE 500
  28. SHIFTOUT DIN,SCL,MSBFIRST,[%00111000] ' $38  2 bájtos olvasás következik
  29. SHIFTIN DOUT,SCL,MSBPOST,[adat\16]
  30.  
  31. DEBUG DEC adat , " , "
  32.  
  33. GOTO ujra
  34.  
  35. -------------------------------------------------------------------------------------------------
  36. Arduino program (ami nem működik):
  37.  
  38. #include "SPI.h"
  39.  
  40. #define SCLK    13
  41. #define DATAOUT 12    //MISO az AD7715 DOUT lábára van kötve
  42. #define DATAIN  11    //MOSI
  43. #define RESET   8
  44.  
  45.  
  46. void setup()
  47. {
  48.   pinMode(RESET, OUTPUT);
  49.  
  50.  digitalWrite(SCLK, HIGH);
  51.  digitalWrite(RESET, LOW);
  52.  
  53.  SPI.setBitOrder(MSBFIRST);               // AD7715 requires data to be sent MSB (most significant bit) first??
  54.  SPI.setDataMode(SPI_MODE0);             // SCLK idle low (CPOL=0), MOSI read on rising edge (CPHI=0)
  55.  SPI.setClockDivider(SPI_CLOCK_DIV16);  // ATmega328P at 16 MHz, so SPI = 1 MHz
  56.  Serial.begin(9600);
  57.  SPI.begin(); // wake up the SPI bus.
  58.  delay(500);
  59.  digitalWrite(RESET, HIGH);
  60. }
  61.  
  62. word adat;
  63. void loop()
  64. {
  65.  delay(500);
  66.  SPI.transfer(0x10);              // set the gain to 1, standby off and set the next operation as write to the setup register
  67.  SPI.transfer(0x68);              // 66 set unipolar mode (csak +), buffer on, no filter sync, confirm clock as 2.4576MHz, set output rate to 50Hz and do a self calibration
  68.  delay(500);
  69. //  adat = SPI.transfer(0x38);       // read the 1st byte
  70. //  adat <<= 8;                      // shift the byte to the high 8 bits
  71. //  adat |= SPI.transfer(0);         // read the 2nd byte and OR to the low 8 bits of adcRead
  72.   adat = SPI.transfer16(0x38);  // vagy egyszerre olvassuk ki a 16 bitet, persze ezzel sem működik
  73.  
  74.  Serial.println(adat,DEC);
  75. }
A hozzászólás módosítva: Ápr 5, 2018
Moderátor által szerkesztve
(#) proba válasza HiMen hozzászólására (») Ápr 4, 2018 / 1
 
Idézet:
„Igazából nem értem hol van definiálva, hogy az arduino SPI.h könyvtár utasításai a 13-11 lábakat használják”

Szerintem az hardveresen van definiálva. Egyszerűen a chip ezen lábainak ez az alternatív funkciója.
(#) kapu48 válasza HiMen hozzászólására (») Ápr 4, 2018 / 1
 
Ezeket már nem kel a begin után állítani:
  1. void SPIClass::begin() {
  2.     pinMode(SCK, SPECIAL);  ///< GPIO14
  3.     pinMode(MISO, SPECIAL); ///< GPIO12
  4.     pinMode(MOSI, SPECIAL); ///< GPIO13
  5.  
  6.     SPI1C = 0;
  7.     setFrequency(1000000); ///< 1MHz
  8.     SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
  9.     SPI1U1 = (7 << SPILMOSI) | (7 << SPILMISO);
  10.     SPI1C1 = 0;
  11. }


Igy próbáltad?
  1. SPI.transfer(0x10); // set the gain to 1, standby off and set the next operation as write to the setup register
  2. SPI.transfer(0x68); // 66 set unipolar mode (csak +), buffer on, no filter sync, confirm clock as 2.4576MHz, set output rate to 50Hz and do a self calibration
  3. delay(500);
  4. SPI.transfer(0x38); //Parancs küldés, read the 1st byte
  5. // adat <<= 8; // shift the byte to the high 8 bits
  6. // adat |= SPI.transfer(0); // read the 2nd byte and OR to the low 8 bits of adcRead
  7. adat = SPI.transfer16(0x0000); // egyszerre olvassuk ki a 16 bitet, persze ezzel sem működik
  8.  
  9. Serial.println(adat,DEC);
A hozzászólás módosítva: Ápr 4, 2018
(#) Moderátor hozzászólása HiMen hozzászólására (») Ápr 5, 2018
 
Légy szíves, kód beszúrásához használd a hozzászólás író ablakban található "Kód" gombot!
Köszönjük.
(#) HiMen válasza kapu48 hozzászólására (») Ápr 5, 2018 /
 
kapu48 !
Igen! Így már megy, zseni vagy! Az SPI.transfer függvényt úgy kell meghívni ahogy leírtad.
Még az SPI_MODE0 helyett SPI_MODE3 -at állítottam be (CPOL = 1 , CPHA = 1) mert úgy látom az AD7715 adatlapján, hogy úgy szereti. De ez nem változtatott a program kimenetén. Érdekes...
A kiírt érték stabil és az analóg feszültség változását követi.

Ide teszem a működő programot, hátha valakinek majd segít aki pont ezzel kínlódott:
  1. // AD7715 kiolvasása
  2. #include "SPI.h"
  3.  
  4. #define SCK    13
  5. #define MISO   12    
  6. #define MOSI   11  
  7. #define RESET   8
  8.  
  9.  
  10. void setup()
  11. {
  12.   pinMode(RESET, OUTPUT);
  13.   digitalWrite(RESET,LOW);
  14.  
  15.   SPI.setBitOrder(MSBFIRST);               // AD7715 requires data to be sent MSB (most significant bit) first??
  16.   SPI.setDataMode(SPI_MODE3);             // SCLK idle low (CPOL=0), MOSI read on rising edge (CPHI=0)
  17.   SPI.setClockDivider(SPI_CLOCK_DIV16);  // ATmega328P at 16 MHz, so SPI = 1 MHz
  18.   Serial.begin(9600);
  19.   SPI.begin(); // wake up the SPI bus.
  20.   delay(100);
  21.   digitalWrite(RESET,HIGH);
  22.   delay(10);
  23.   SPI.transfer(0x10);              // set the gain to 1, standby off and set the next operation as write to the setup register
  24.   SPI.transfer(0x66);              // 66 set unipolar mode (csak +), buffer on, no filter sync, confirm clock as 2.4576MHz, set output rate to 50Hz and do a self calibration
  25.  
  26. }
  27.  
  28. word adat;
  29. void loop()
  30. {
  31.  
  32.   SPI.transfer(0x38);
  33.   adat = SPI.transfer16(0x0000);
  34.  
  35.   Serial.println(adat,DEC);
  36.  
  37. delay(500);
  38. }
(#) kapu48 válasza HiMen hozzászólására (») Ápr 5, 2018 /
 
Már csak a sorrenddel van probléma!
Első a:
SPI.begin();
Uttána jöhet a többi:
SPI.xxx();

Tutorial: Arduino and the SPI bus
(#) mcucoder hozzászólása Ápr 5, 2018 /
 
Arduino Nano-t szeretnék használni úgy, hogy sleep-ből csak igen rövid időre ébredjen fel (10..30ms), végezze el a dolgát, majd menjen vissza megint sleepbe.Sleep alatt 10uA alatti fogyasztást szeretnék, mivel akkus táplálású az eszköz.Ébrenlét alatt 40..80mA-et fogyaszt max. 1 ms-ig, majd 5..10 mA-ert a fennmaradó ébrenléti időben (10..30ms).
A tesztelések alatt szembesültem azzal, hogy nem tudtam sleep alatt még csak megközelíteni sem a 10 uA-ert.
Ha a teljes rendszer tápfeszültségét kikapcsoltam (nulla fogyasztás), akkor a tápfesz megjelenésekor az arduino rendszer 2-4 sec mulva indult el, és ez alatt persze nagy volt a fogyasztás.Gondolom a bootloader rész "huncutkodik", ezért ezt szeretném kikapcsolni, hogy azonnal késedelem nélkül induljon a program végrehajtása (ne várjon programbetöltésre !).

Másik megoldási lehetőségem az lenne ha sikerülne sleep alatt levinni az AVR fogyasztását 10 uA alá.

PIC32MM0064GPL028-al sikerült sleep alatt a rendszer összfogyasztását 4 uA alá vinni, de itt meg a "nyavalyás" NRF24L01-et nem tudom egzaktul lekezelni.Ezért próbálnám arduino-val megoldani a feladatot.

Tudtok valami megoldást javasolni AVR-re?
Előre is köszönöm:
mcucoder
(#) Feri007 válasza mcucoder hozzászólására (») Ápr 5, 2018 /
 
A kérdésed mehetett volna egyből az Arduino topikba.

Szóval, ha már kész az Arduinos- programod, normál AVR programozóval kellene feltöltened a kódot, úgy, hogy felülírod, és ezáltal "letiltod" a bootloadert.
Sejtem, hogy azt szeretnéd, hogy feltlötöd a programod bootloaderrel, majd kikapcsolod. De akkor soha nem tudna újból aktívvá válni. Ezesetben később kellene a programzó, ha hozzá kell nyúlni ismet.
A hozzászólás módosítva: Ápr 5, 2018
(#) mcucoder válasza Feri007 hozzászólására (») Ápr 5, 2018 /
 
Köszönöm!
Megpróbálom, van AVR programozóm.
Az AVR fogyasztását hogyan tudom minimalizálni sleepben ?
Erre is van javaslatod ?
(#) Feri007 válasza mcucoder hozzászólására (») Ápr 5, 2018 /
 
Idézet:
„Az AVR fogyasztását hogyan tudom minimalizálni sleepben ?”


Attól függ, mit akarsz életben tartani sleepben, és mivel akarod felébreszteni.
Amúgy a Google a barátod.
http://lmgtfy.com/?q=reducing+Arduino+power+consumption+sleep+mode
A hozzászólás módosítva: Ápr 5, 2018
(#) Kovidivi válasza mcucoder hozzászólására (») Ápr 5, 2018 /
 
Az alaplapi LED-eket leszedted? Az USB-soros konverter IC fogyasztásával mi lesz? Felhúzó ellenállások (ha vannak)?
(#) berkesandor válasza mcucoder hozzászólására (») Ápr 5, 2018 /
 
Miért ragaszkodsz az UNO-hoz, használj Pro Mini-t.
https://www.gammon.com.au/forum/?id=11497
A hozzászólás módosítva: Ápr 5, 2018
(#) mcucoder válasza Feri007 hozzászólására (») Ápr 5, 2018 /
 
Szia!
Idézet:
„Attól függ, mit akarsz életben tartani sleepben, és mivel akarod felébreszteni.”


Ha jól értelmezem, akkor sleepből (legkisebb fogysztású mód) csak külső interrupt, vagy ha a WDT engedélyezve van, akkor a WDT is ébreszthet.
Esetemben a külső interruptot nem szivesen használnám (+ áramköri elemek.. ) a WDT-vel viszont nem tudok 3-5 ms felbontással időzíteni.
Timer2-vel (asyncron mode) lehetne, de sleepben az aszinkron TMR2 (32768 quarc) nem fut !
Milyen egyéb megoldás lehetne még ?
(#) berkesandor válasza mcucoder hozzászólására (») Ápr 5, 2018 /
 
https://github.com/rocketscream/Low-Power
Itt be tudsz állítani altatási ciklusokat, 8 mp a maximum, de azt tetszőleges számban lefuttathatod.
Ha pontosabb időzítés kell, beraksz egy RTC-t.
(#) Feri007 válasza mcucoder hozzászólására (») Ápr 5, 2018 /
 
Nagyjából megirták a többiek a választ, ill a http://www.gammon.com.au/power -t érdemes végignézni. Hogy neked mi az optimális, kiválaszthatod.
És, valóban, nem Arduinoban érdemes gondolkozni, mert az USB-serial eleve sokat fogyaszt és nem kapcsolható sleep-be.
Hanem "pucér" Atmega328P + kvarc.
(#) mcucoder válasza berkesandor hozzászólására (») Ápr 5, 2018 /
 
Idézet:
„Ha pontosabb időzítés kell, beraksz egy RTC-t.”
Szia!

Melyiket?
Mert a legtöbb RTC-nél 500 ms, 1s, vagy nagyobb értékek állíthatók be.
Nekem meg 3900 - 4100 ms közti időzítés kell 3-5 ms felbontással. mivel a sleep hosszát minden belépés előtt be kell állítanom, és ciklusról ciklusra esetenként más értékekkel.

PIC-nél a Timer1 időzítőt használva 32768 kvarccal (ami sleep alatt is fut 1 uA alatti fogyasztással) ezt sikerült megoldanom, de sajna az NRF24L01 kezelését nem tudtam egzaktul leprogramozni.
Ezért kellene az AVR (arduino) a "jó kis RF24 lib-el" (kipróbáltam, ez legalább üzembiztosan megy), de hát itt meg a fogyasztással küzdök.
(#) berkesandor válasza mcucoder hozzászólására (») Ápr 5, 2018 /
 
Magyarul 4 mp-két akarsz ébreszteni, lefut egy művelet, visszaaludni?
pl. : https://github.com/rocketscream/Low-Power/blob/master/Examples/powe...ic.ino
A hozzászólás módosítva: Ápr 5, 2018
(#) kapu48 válasza mcucoder hozzászólására (») Ápr 5, 2018 /
 
Felejsd el az AVRt.
És használd ezt: Bővebben: STM103

Beépítet USB és RTC, és minden fogyasztást tudsz szabályozni.
Teszel mellé 3V-os gomb ellemet.
Ha lejjebb veszed az órajelet még kevesebbet fogyaszt.
Mindezt Arduino IDE alatt.
A hozzászólás módosítva: Ápr 5, 2018
(#) mcucoder válasza berkesandor hozzászólására (») Ápr 5, 2018 /
 
Idézet:
„Magyarul 4 mp-két akarsz ébreszteni, lefut egy művelet, visszaaludni?”


Köszönöm a hozzászólást.
Inkább úgy mondanám hogy 3-4-5-6-n másodpercenként, de mivel több eszköz (több AVR-el) megy egyidőben, és mindegyik csak a saját 20-30 ms-os időablakában működhet, ezért biztosan lesz eltérés az egyes AVR példányok WDT időalapja között, ezért ciklusról ciklusra mindegyik eszköz "szinkronizál" egy 2,4GHz-en vett központi időalaphoz.(Az eszközök nem működhetnek egy időben, vagyis egy adott időablakban csak 1 eszköz mehet!)
Tehát kellene a 3-4 ms-os felbontás, és mondjuk max 65 sec-os max. hossz.
Másik kolléga javasolta az STM103-at. Megnézem ...
(#) mcucoder válasza kapu48 hozzászólására (») Ápr 5, 2018 /
 
Idézet:
„És használd ezt: Bővebben: STM103”


Szia!
Kösz az ötletet.
Adatlap szerint az RTC legkisebb beállítható hossza 1sec! Az előosztóval (20 bites) ezt hosszabíthatjuk meg. Sajna ez így nem jó, mert nem tudok tetszőleges hosszt beállítani.
Pl: 3954 ms-ot, vagy 4076 ms-ot, stb ...
Pedig már reménykedtem ...
(#) kapu48 válasza mcucoder hozzászólására (») Ápr 5, 2018 /
 
Téves az RTC ismereted!

Korlátlan az alarm funciója, és bármikor ujra programozhatod.

Mivel belső eszköz, ezértmég plusz megszakítás pint sem foglal.

Bővebben: RTC

Bővebben: NRF..
A hozzászólás módosítva: Ápr 5, 2018
Következő: »»   440 / 852
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem