Küsimus:
RF kaugjuhtimispult VirtualWire abil ATtiny85-l, mis töötab sisemise ostsillaatori juures 8MHz
Ricardo
2014-03-18 05:42:09 UTC
view on stackexchange narkive permalink

Püüan teha raadiosagedusliku kaugjuhtimispuldi, kasutades sisemise ostsillaatori kiirusel 8MHz töötavat ATtiny85, seda odavat RF 434MHz saatemoodulit (nagu allpool toodud) ja VirtualWire libi seni polnud edu .

RF transmitter

Nii et enne kui lähen edasi, kas on võimalik kasutada sisemise ostsillaatoriga VirtualWire'i koos ATtiny85-ga, mis töötab 3.6V ja 8MHz juures? Kui jah, siis kuidas?

Olen Netist leidnud paar hajutatud teabeallikat selle kohta, kuid ei osanud sellest eriti aru saada.

Mul on VirtualWire'i abil ehitatud vastuvõtja ja saatja ATMega328 versioon ilma suuremate probleemideta. Mõlemad moodulid räägivad omavahel väga vähe andmeid. Nüüd, kui proovisin ATtiny85 abil ATMega328 saatjat väiksema versiooniga asendada, on mul probleeme.

Siin on sümptomid:

  1. Peamine tundub olevat see, et kui lisan VirtualWire include, näib, et minu visand aeglustub palju . Nii et ma arvan, et see on ajastamise küsimus. Kuid ma pole kindel, milles probleem on.

  2. Panin ATtiny85 tihvtile 6 (PB1) ulatuse, kuid ma ei näe midagi edastatavat tugev>. Ma arvan, et olen pin-nimedega sassi läinud.

  3. Ma saan LED-i vilkuma ja nuppe probleemideta lugeda.

Siin on skeemid ja Kaugjuhtimispuldi plaadi kujundus:

RC schematic

Plaadi toiteallikaks on praegu 2 AA NiMH patareid, mis on hetkel 2,6 V pingel. Ma saan panna ATtiny85 selle pingega vilkuma. Plaanin toita RC-d 3,6 V CR2 liitiumpatareiga.

Siin on minu arenduskeskkonna üksikasjad:

  • Arduino IDE 1.05
  • Kasutan ATtiny südamikke siit
  • Programmeerin ATtiny85, kasutades Interneti-teenuse pakkujana Arduino UNO R3 probleemideta (see töötab, kuna saan panna ATtiny85 LED-i vilkuma ).

Ja siin on minu kood:

  #include <VirtualWire.h> # define VCC_PIN A1
#define BTN_PIN A2 # define LED_PIN A3 # define TXD_PIN PB1 # define BLINK_UP_TIME 25 # defineeri BUTTON_NONE 0 # define BUTTON_1 1 # define BUTTON_2 2 # define BUTTON_3 3 # define BUTTON_4 4 # define BUTTON_5 5 # define BUTTON_6 6void setup () {pinMode BTN_PIN, INPUT); pinMode (TXD_PIN, OUTPUT); pinMode (VCC_PIN, OUTPUT); pinMode (LED_PIN, OUTPUT); // jätke raadiosaatja nüüd välja lülitatuks digitalWrite (VCC_PIN, LOW); // IO ja ISR initsialiseerimine vw_set_tx_pin (TXD_PIN); vw_setup (2000); // Bitti sekundis // anna kasutajale teada, et me oleme elus: südamelöök vilgub (3, 50); delay (1000);} uint8_t buf [VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; void loop () {baidi nupp = ReadButtons (); if (nupp! = BUTTON_NONE) {// edastamisnupp vajutatud digitalWrite (LED_PIN, HIGH); // Vilgutage valgust, et näidata edastavat digitalWrite'i (VCC_PIN, HIGH); // lülitage tranmitter viivitusele (10); buf [0] = nupp; vw_send (buf, 1); vw_wait_tx (); // Oodake, kuni kogu kiri on kadunud digitalWrite (LED_PIN, LOW); // lülitage LED digitalWrite välja (VCC_PIN, LOW); // lülita saatja välja} viivitus (100);} baiti ReadButtons () {unsigned int buttonVoltage = analogRead (BTN_PIN); baitide nupp = BUTTON_NONE; // tagastage nuppu vajutamata, kui allpool toodud kontrollid ei kirjuta btn-le if (buttonVoltage < 10) {button = BUTTON_1; } else if (buttonVoltage < 200) {button = BUTTON_2; } else if (buttonVoltage < 400) {nupp = BUTTON_3; } else if (nuppPinge < 550) {nupp = NUPP_4; } else if (buttonVoltage < 720) {nupp = BUTTON_5; } else if (nuppPinge < 900) {nupp = NUPU_6; } else if (buttonVoltage > 1000) {nupp = BUTTON_NONE; } return (nupp);}  

Nii et Mis on minu seadistusega valesti?

Teate, et peate üldiselt saatja moodulisse antenni lisama, eks? Võib-olla proovige ka virtuaalse traadi seadistamisel bitti sekundis vähendada.
@FakeName noh, ausalt öeldes ei raatsinud ma RF-moodulit veel plaadile joota, kuna ma ei saa isegi MCU-d veel bitti TX-tihvti saata. Nii et ma panen skoobi sondi TX-nööpnõelale ja kui näen na edastuskatset, siis jootan mooduli sisse.
Ah, ohoo, jäi sellest puudu. Kindlasti peate uurima korralikku tihvtide kaardistamist. Virtuaaltraaditeek nõuab üldist AVR8 tuge, samuti on sellel ATtiny84 kohta konkreetne märkus. Olen siiski uudishimulik. Mõned teie tihvtidest on `A {n}, samas kui saatja tihvt on` PB {n} `. Kas see on õige nööpnõel?
Ma ei näe üheski teie lingitud ATtiny päises defineeritud `PB1`. Eeldades, et teie saatja asub sadamas B, tihvt 1, peaksin ma arvan, et * peaksite olema "#define TXD_PIN 1", kuna porti B pääseb lihtsalt tavapärase digitaalse IO-mälu abil.
@FakeName Pärast pikka silumist töötas minu jaoks lõplik `Axi 'tihvtide kombinatsioon (välja arvatud ilmselgelt TXD tihvt). Võite vist viidata kas PBx või Ax, kuna need on makrod, mis lõpuks asendatakse täisarvudega (siin arvatakse).
Küsimus on selles, et paistab, et staatilisi muutujaid, millele PBx viitab, pole ATtiny teegid * määratlenud, nii et need võivad lihtsalt toimida * juhuslikult *. Kas olete veendunud, et PORT B ​​1 saab normaalselt juhtida (nt tavaliste käskudega `digitalWrite ()`? Teise võimalusena vahetage lihtsalt LED- ja TX-tihvtid ning kasutage andmete väljundiks LED-tihvti (mis teie teada töötab)
Tõepoolest, PBn määratleb AVR-Libc. Nii juhtub, et arduino-pisikesed kaardistavad PBn-d Dn-iga ja iga `PBn 'määratletakse väärtusega` n' kasutamiseks koos `_BV ()'ga.
Mainite, et kasutate Arduino IDE-d, kas olete oma ATtiny jaoks määranud uue tahvli? Selle saab lisada saidile `ARDUINO_INSTALL_DIR / harware / arduino / boards '. Vastasel juhul peate "#define VW_PLATFORM VW_PLATFORM_GENERIC_AVR" ja kasutama üldiste AVR-platvormide jaoks vajalikke lisakõnesid.
@jfpoilpret Attiny-master pakett installib IDE-le terve hulga uusi ATtiny-plaate. See toetab mitut ATtiny45 / 84/85 ja 1/8 / 16MHz kombinatsiooni koos sisemiste ja väliste ostsillaatoritega. Olen võimeline programmeerima 85 kõigi kolme kellaga, kui VW-d kommenteerin.
Kas teil on võimalus kontrollida, kas MCU sagedus on sama kui koodi koostamisel kasutatud sagedus `F_CPU '? Tavaliselt, kui programm näib olevat aeglasem kui peaks, on see sageli tingitud erinevusest "F_CPU" ja tegeliku sageduse vahel (mis teie puhul on arvatavasti sulavkaitsete abil).
Kas aeglustumine toimub 3,6 V kasutamisel võrreldes 5 V kasutamisega?
Aeglustumine toimub siis, kui lisan VirtualWire'i kaasamis- ja funktsioonikõned. Kui ma neid kommenteerin, saab ajastus jälle normaalseks.
Kas proovisite lisada ainult VirtualWire'i, kuid funktsioonikõnet ei olnud? See välistaks võimaluse, et kaasajad määratleksid mõned makrod uuesti.
@jfpoilpret - kommenteerin silumise korral kaasamist JA kõnesid sisse ja välja, edasi-tagasi. Kuid ainult kõned ei kompileeru ilma kaasamiseta.
Minu mõte oli tegelikult hoida kaasamine, kuid eemaldada kõned (mis peaksid kompileeruma), seejärel kontrollige, kas katsetate aeglustumist või mitte. Kui jah, siis see tähendaks, et kaasuses on midagi, mis kirjutab üle ühe makro nagu "F_CPU" või staatilise muutuja (klassieksemplar), mis koostamisel muudab midagi olulist.
@jfpoilpret sain aru. Proovib enne, kui ma tahvlil alla annan. Tõenäoliselt astun sammu tagasi ja valmistan sellest ATmega328 versiooni.
Mul endal on ATtiny85-ga probleeme olnud kellaga. Kunagi proovisin ühele LCD-d kinnitada ja see ei töötaks kunagi, vaid paar korda suutsin teha segaduses oleva teksti.
Neli vastused:
#1
+3
imjosh
2014-03-21 02:55:14 UTC
view on stackexchange narkive permalink

Proovisin neid pisikesi südamikke, mida kasutate, ja mul oli palju probleeme. Ma läksin üle aadressile http://code.google.com/p/arduino-tiny/ ja see tundub palju parem. Looge teine ​​Arduino installikaust ja lisage arduino pisikesed südamikud. PIN-koodi konstandid on näiteks PIN_A0, PIN_A1, ..., PIN_B1 jne. Proovige seda siis proovida.

Vaatasin lühidalt VirtualWire'i koodi ja seal on spetsiaalselt Attiny85 jaoks mõeldud ifdef-e töö. Siin on tuletatud projekt töötavate ATTINY85 näidetega: http://cosa-arduino.blogspot.de/2013/03/news-virtual-wire-interface.html

+1 suurepärane, aitäh! Proovin ja annan teada.
#2
+3
Mr.K
2018-08-23 00:43:34 UTC
view on stackexchange narkive permalink

Värskendatud 26.8.2018: lisatud tx (vale); saatmise lõpus. Ilma selleta võib TX-pin jääda kõrgeks, ujutades üle 433 MHz sagedusriba ja muutes sellega igasuguse muu suhtluse peaaegu võimatuks !!!

Kuigi need kõik on üsna vanad postitused, olen ma ikkagi VirtualWire'i hankimisega vaeva näinud või selle järeltulija RadioHead, kes töötab Attiny85-l. Tavaliselt on probleemiks see, et VirtualWire kasutab taimerit 0 ja seeläbi rikub muud asjad.

Nüüd ei soovi RX-i puhul tavaliselt kõiki oma töötlustsükleid kulutada bittide saabumist ootama, nii et soovite olge katkestuspõhine, kuid TX-i jaoks saate sageli ilma selleta hakkama ... Niisiis tegin VirtualWire TX-koodi veidi ümber ja muutsin seda lihtsaks saatmisrutiiniks, mida saab kasutada ilma spetsiaalset taimerit vaja- vahele segama. Kasutades Attiny85-is allpool olevat koodi ja tavalise VirtualWire-teegi ja sama baudikiirusega vastuvõtjana Arduino Unot, töötab see minu jaoks lihtsalt suurepäraselt, nii et kui keegi teine ​​saab sellest kasu, siis siin see on (sealhulgas mõni kood ultraheli lugemiseks kauguseandur ja mõne LED-i juhtimine - lugeja saab lahti vajaliku):

  #include <util / crc16.h> # define LED_PIN 3 # define LED2_PIN 4 # define TX_PIN 2 # define TX_BAUDRATE 2000 # define TX_MICROINTERVAL (1000000UL / TX_BAUDRATE) #define TX_MAXLEN 12 # define TRIGGER_PIN 0 # define ECHO_PIN 1line void led (const bool onOff) {digitalWrite (LED_PIN, onOff? HIGH: } inline void led2 (const bool onOff) {digitalWrite (LED2_PIN, onOff? HIGH: LOW); } inline void tx (const bool onOff) {digitalWrite (TX_PIN, onOff? HIGH: LOW); } inline void trigger (const bool onOff) {digitalWrite (TRIGGER_PIN, onOff? HIGH: LOW); } const uint8_t päis [8] = {0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x38, 0x2C}; const uint8_t conv4to6 [16] = {0x0D, 0x0E, 0x13, 0x15, 0x16, 0x19, 0x1A, 0x1C 0x23, 0x25, 0x26, 0x29, 0x2A, 0x2C, 0x32, 0x34};
void rawSend (const uint8_t * p, uint8_t len) {while (len--) {const uint8_t val = * p ++; for (uint8_t mask = 1; mask! = 0x40; mask << = 1) {tx (val & mask); delayMicroseconds (TX_MICROINTERVAL); }}} void send (const uint8_t * buf, const uint8_t len) {// Looge kõigepealt kasulik koormus ... staatiline uint8_t kasulik koormus [(TX_MAXLEN + 3) * 2]; uint8_t * p = kasulik koormus; uint16_t crc = 0xFFFF; uint8_t v = len + 3; crc = _crc_ccitt_update (crc, v); * p ++ = conv4to6 [v >> 4]; * p ++ = conv4to6 [v & 0x0F]; for (uint8_t l = len; l--;) {v = * buf ++; crc = _crc_ccitt_update (crc, v); * p ++ = conv4to6 [v >> 4]; * p ++ = conv4to6 [v & 0x0F]; } crc = ~ crc; v = (uint8_t) crc; * p ++ = conv4to6 [v >> 4]; * p ++ = conv4to6 [v & 0x0F]; v = (uint8_t) (crc >> 8); * p ++ = conv4to6 [v >> 4]; * p ++ = conv4to6 [v & 0x0F]; // Nüüd edastage päis ja kasulik koormus ... rawSend (header, sizeof (header)); rawSend (kasulik koormus, (len + 3) * 2); tx (false);} void setup () {pinMode (LED_PIN, OUTPUT); pinMode (LED2_PIN, OUTPUT); led (vale); led2 (vale); pinMode (TX_PIN, OUTPUT); tx (vale); pinMode (TRIGGER_PIN, OUTPUT); pinMode (ECHO_PIN, INPUT); päästik (vale);} int mõõt () {päästik (vale); viivitus (10); päästik (tõene); viivitus (10); päästik (vale); // Toetame kuni 6 m, st 6000 mm, nii et lõpuni jõudmiseks // ja tagasi kuluks // 6000 mm * 2 / 0,34 mm / ms = 35294 ms, seega kasutame nendel // joontel ajalõppu ... allkirjastamata pikk kestus = pulseIn (ECHO_PIN, HIGH, 36000); kui (! kestus || (kestus > 35500)) tagastab 0; return (int) (kestus * 34/200);} int bufferedMeasure () {staatiline int lastVal = 0; staatiline boollüliti = true; int newVal = mõõt (); if (newVal) {led2 (ümberlülitamine); lülitama =! lülitama; lastVal + = (newVal-lastVal) / 10; } return lastVal;}
// tsükli rutiin jookseb ikka ja jälle igavesti: void loop () {// Mõõda kaugust ... int val = bufferedMeasure (); if (val) {staatilised allkirjastamata pikad andmed; juhitud (tõsi); andmed = 0xD1570000UL | val; saada ((const uint8_t *) &data, sizeof (andmed)); led (vale); } muu {led (true); viivitus (100); led (vale); viivitus (100); juhitud (tõsi); viivitus (100); led (vale); viivitus (100); juhitud (tõsi); viivitus (100); led (vale); } viivitus (1000);}  
#3
+1
Joel
2014-05-21 06:40:54 UTC
view on stackexchange narkive permalink

Proovige selle asemel manchesteri raamatukogu. See postitus sisaldab kogu vajalikku teavet, välja arvatud ühendusskeemid: Manchesteri raamatukogu ei koosta Attiny85 jaoks

#4
+1
user2973
2014-07-21 01:28:53 UTC
view on stackexchange narkive permalink

Veetsin mõnda aega, et VirtualWire töötaks attiny84-ga. Ma näen teie koodiga kahte probleemi:

  1. Kuna tiny85-l on ainult üks taimer, kasutavad seda ühte nii VirtualWire kui ka millis / mikros kood>. Nii et teie viivitused ei toimi ootuspäraselt.
  2. VirtualWire kasutab vaikeväärtusi vw_ptt_pin (10) ja vw_rx_pin (11) jaoks. Attiny'il neid tihvte pole olemas85. Kui vwsetup kutsub nende väärtustega pinMode , põhjustab see kirjutamist suvalistele mäluaadressidele. Tõenäoliselt paneb see teie visandi käituma ettearvamatult. Parandage komplektide vw_set_ptt_pin () ja vw_set_rx_pin () määramiseks tiny85-s olevatele tihvtidele või muutke allikat VirtualWire.
Tänan sind vastuse eest. Mul oli ülaltoodud üksuse sümptomeid: ajastus läks valesti, kui proovisin VirtualWire'i tööle panna. Punkt 2 näib olevat hea põhjus, miks kogu asi ei tööta. Minu lahendus selle probleemi lahendamiseks oli RF-kraami jaoks ATmega328 kinnipidamine. Heidan pilgu ja vaatan, kas saan oma ATTinies'iga uuesti VW kasutamist.


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...