Inhoudsopgave:
Video: UChip - Serieel via IR! - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:16
Draadloze communicatie is tegenwoordig een belangrijk kenmerk in onze projecten geworden en als we het over draadloos hebben, is het eerste dat in me opkomt Wi-Fi of BT, maar het omgaan met de Wi-Fi- of BT-communicatieprotocollen is geen gemakkelijke taak en kost veel van MCU-bronnen, waardoor er weinig ruimte overblijft voor het coderen van mijn toepassing. Daarom kies ik meestal voor een externe Wi-Fi/BT-module die serieel is aangesloten op de microcontroller om de rollen te splitsen en meer vrijheid te krijgen.
Soms zijn Wi-Fi en BT echter "overkill" voor sommige toepassingen die een lage bitrate en een korte communicatieafstand vereisen. Bovendien impliceert het gebruik van Wi-Fi of BT de noodzaak om uw smartphone of apparaat met de juiste authenticatie te verbinden.
Stelt u zich eens voor dat u gewoon een buitenlamp aan/uit moet doen, de lampintensiteit moet wijzigen of een elektrisch hek moet openen. Zou het de moeite waard zijn om Wi-Fi of BT te gebruiken?
Afhankelijk van de omgeving en toepassingen kan draadloze communicatie via IR (infrarood) golflengte van pas komen. Een Serial over IR, geïmplementeerd met weinig externe componenten (3 discrete componenten!) en uChip (een zeer klein Arduino-compatibel bord) kunnen de oplossing zijn waarnaar u op zoek was!
Stuklijst (voor één Tx-Rx-apparaat):
1 x uChip
1 x IR LED: met de emissiepiek bij 950nm
1 x TSOP-38238 (of equivalent)
1 x 1KOhm-weerstand:
Hardware
1 x breadboard/protoboard
1 x zwarte kunststof buis: binnendiameter even groot als de IR LED, de buis is nodig om overspraak met de TSOP-ontvanger te voorkomen.
1 x aluminiumfolie (3 cm x 3 cm)
1 x band
TIP: U kunt een alleen-TX- of alleen-RX-apparaat maken voor het geval u eenrichtingscommunicatie nodig hebt door de onnodige RX/TX-hardware uit het circuit te verwijderen of de bijbehorende code in de schets in of uit te schakelen.
Stap 1: Bedrading
Verbind de componenten volgens het schema met elkaar.
Een paar opmerkingen over het eenvoudige schema. Aangezien de TSOP-38238 een voeding van 2,5 V tot 5 V mogelijk maakt en maximaal 0,45 mA absorbeert (u vindt de datasheet HIER), zal ik de ontvanger van stroom voorzien met twee pinnen, die respectievelijk voor aarde en voeding zorgen. Hierdoor kan de ontvanger on-demand worden in-/uitgeschakeld en is een zeer eenvoudige hardwarebedrading mogelijk. Verder, als u eenrichtingscommunicatie nodig heeft, kunt u kiezen of u een (Tx/Rx)-only apparaat wilt maken door de TSOP-38238 eenvoudig uit te schakelen/in te schakelen.
Hoe werkt de schakeling?
Het is vrij eenvoudig. De TSOP-uitgangspen wordt laag getrokken wanneer de sensor een trein van 6 pulsen of meer detecteert bij 38 KHz, aan de andere kant wordt hij hoog getrokken wanneer er niet zo'n signaal is. Daarom, om de seriële gegevens via IR te verzenden, voedt het circuit de LED-anode met een 38 KHz PWM gemoduleerd met het TX-seriële signaal dat de LED-kathode laag trekt.
Bijgevolg is op een hoog niveau van de seriële TX0 de LED niet vooringenomen of omgekeerd (geen pulsen) en wordt de TSOP-uitgangspen hoog getrokken. Door een laag niveau op de serieel te verzenden, wordt de LED gevoed en genereert deze IR-pulsen overeenkomstig het toegepaste PWM-signaal; daarom wordt de TSOP-uitgang laag getrokken.
Aangezien de transmissie direct (0->0 en 1->1) is, zijn er geen omvormers of andere logica aan de ontvangerzijde nodig.
Ik regel het optische uitgangsvermogen van de LED door de PWM-duty cycle te selecteren op basis van de toepassing. Hoe hoger de duty-cycle, hoe hoger het optische uitgangsvermogen en dus hoe verder u uw bericht verzendt.
Houd er rekening mee dat we nog steeds pulsen moeten genereren! U mag dus niet boven de 90% duty cycle gaan, anders zal de TSOP het signaal niet als pulsen detecteren.
Heb je meer vermogen nodig?
Om de stroom te verhogen, kunnen we gewoon de waarde van de weerstand van 1 kOhm verlagen?
Misschien, wees niet te veeleisend! De maximale stroom die u van een pin van de MCU krijgt, is beperkt tot 7 mA wanneer de poortpin sterker dan normaal wordt aangestuurd (PINCFG. DRVSTR = 1 en VDD > 3V), zoals vermeld in de SAMD21-datasheet.
De standaardconfiguratie (die standaard door de Arduino IDE-bibliotheken wordt gebruikt) beperkt de stroom tot 2mA. Daarom geeft het gebruik van 1kOhm al de huidige limiet met de standaardinstellingen!
Het verhogen van de stroom is niet alleen een kwestie van elektrische componenten. Kort:
- Verander de weerstand (waarvan de minimumwaarde beperkt is tot ongeveer 470Ohm -> VDD/470~7mA);
- Stel de overeenkomstige PORT->PINCFG->DRVSTR in op 1;
Ik zal de code met deze functie in een toekomstige update verstrekken.
Maar onthoud dat het niet zo'n goede benadering is om stroom van MCU-pinnen dicht bij de limieten te laten zinken en af te voeren. Het verlaagt inderdaad de levensduur en betrouwbaarheid van de MCU. Daarom raad ik aan om de normale schijfsterkte te behouden voor langdurig gebruik.
Stap 2: Programmeren
Laad de schets "IRSerial.ino" in uChip (of het Arduino-compatibele bord dat u gebruikt).
Als u de pin die de PWM genereert, moet wijzigen, zorg er dan voor dat u een pin gebruikt die is aangesloten op een TCC-timer, aangezien deze versie van de code alleen werkt met TCC-timers (controleer de "variant.c" van uw bord voor deze info). Ik zal de code toevoegen om ook TC-timers te gebruiken in toekomstige updates.
De code is vrij eenvoudig. Na het instellen van de PIN_5 laag (levert TSOP GND) en PIN_6 hoog (voorziet de TSOP van stroom), start de MCU de PWM op PIN_1, stelt de timerperiode in en vergelijkt de opname dienovereenkomstig met de noodzakelijke frequentiemodulatie (in mijn geval is het 38 KHz) en plicht cyclus (12,5% als standaard). Dit wordt gedaan door gebruik te maken van de standaard analogWrite()-functie op PWM-pinnen en alleen het PER_REG (perioderegister) en het CC (capture Compare)-register te wijzigen (de geschreven code is gewoon een knip-en-plaksel uit de bedradings-analoge bibliotheek). U kunt de benodigde frequentie instellen overeenkomstig de TSOP-sensor die PER_REG verandert (wat de bovengrens is voor het resetten van de timerteller), terwijl u CC proportioneel aan de periodewaarde op het gewenste percentage van de inschakelduur zet.
Vervolgens stelt de code de seriële poort in met de juiste baudrate van 2400bps. Waarom zo'n lage baudrate?! Het antwoord staat in de TSOP-datasheet die u HIER kunt vinden. Aangezien de TSOP is voorzien van filters met hoge ruisonderdrukking om ongewenst schakelen te voorkomen, is het noodzakelijk om een reeks van meerdere pulsen te verzenden om de TSOP-uitgangspen naar beneden te trekken (het aantal pulsen is afhankelijk van de TSOP-versie, 6 is de typische waarde). Evenzo wordt de TSOP-uitgang hoog getrokken na een minimale hoeveelheid tijd die gelijk is aan 10 pulsen of meer. Om de TSOP-uitgang in te stellen als het modulerende TX0-signaal, is het daarom noodzakelijk om de baudrate in te stellen met inachtneming van de volgende vergelijking:
Seriële baud < PWM_frequentie/10
Bij gebruik van 38KHz resulteert dit in een baudrate lager dan 3800bps, wat betekent dat de hogere "standaard" toegestane baudrate 2400pbs is, zoals eerder verwacht.
Wil je de baudrate verhogen? Er zijn twee opties.
De eenvoudigste optie is om de TSOP te veranderen in een versie met een hogere frequentie (zoals de TSOP38256), waarmee je de baudrate kunt verdubbelen (4800bps)
Niet genoeg?! Dan moet je je eigen optische link maken met behulp van een eenvoudige IR LED + fotodiode en versterkingscircuits. Deze oplossing vereist echter veel kennis van coderen en elektronica om te voorkomen dat ruis de verzonden gegevens beïnvloedt en daarom is de implementatie ervan helemaal niet eenvoudig! Als u zich echter zelfverzekerd genoeg voelt, bent u meer dan welkom om te proberen uw eigen TSOP-systeem te maken!:)
Ten slotte stel ik de SerialUSB-poort (2400bps) in die ik gebruik om gegevens op de seriële monitor te verzenden en te ontvangen.
De functie loop() bevat de code die nodig is om gegevens over de twee series door te geven en wordt rechtstreeks gekopieerd uit de voorbeeldschets SerialPassthrough waarbij alleen de namen van de series worden gewijzigd.
Stap 3: IR-LED afschermen
Als u de bovenstaande schakelingen opstart na het laden van de " IRSerial.ino " -code, controleer dan de seriële monitor op Arduino IDE en probeer een string te verzenden. U zult waarschijnlijk zien dat uChip precies ontvangt wat het verzendt! Er is overspraak in de schakelingen vanwege optische communicatie tussen de IR-LED en de TSOP van hetzelfde apparaat!
Hier komt het moeilijke deel van dit project, het voorkomen van overspraak! De lus moet worden verbroken om bidirectionele seriële communicatie via IR mogelijk te maken.
Hoe doorbreken we de cirkel?
De eerste optie, je verlaagt de PWM-duty cycle, waardoor het optische vermogen van de LED wordt verlaagd. Deze benadering verkleint echter ook de afstand waarover u een betrouwbaar serieel IR-kanaal krijgt. De tweede optie is het afschermen van de IR LED, waardoor een directionele IR “straal” ontstaat. Het is een kwestie van proberen en opstaan; eindelijk, met behulp van een stuk zwarte pneumatische luchtslang gewikkeld in aluminiumfolie en tape (voor elektrische isolatie) slaagde ik erin om de overspraak te doorbreken. Door de zendende IR-LED in de buis te plaatsen, wordt communicatie tussen de TX en RX van hetzelfde apparaat voorkomen.
Kijk naar de afbeelding om mijn oplossing te zien, maar voel je vrij om andere methoden te proberen en/of om de jouwe voor te stellen! Er is geen absolute oplossing voor dit probleem (tenzij je een eenvoudig eenrichtingskanaal nodig hebt) en je moet waarschijnlijk de circuitlay-out, PWM-taakcyclus en IR-schild afstemmen op je behoeften.
Zodra u de overspraak hebt verbroken, kunt u controleren of uw apparaat nog steeds werkt door een lus te maken op de Tx-Rx van het apparaat die gebruikmaakt van de reflectie van de IR-golflengte op IR-reflecterende oppervlakken.
Stap 4: Communiceer
Dat is alles
Uw seriële via IR-apparaat is klaar om te communiceren, gebruik ze om gegevens via IR te verzenden, schakel alles in of uit of controleer de status van een sensor die u in het geheim verbergt!
De afstand waarop de communicatie betrouwbaar is, is niet zo groot als voor een WiFi- of BT-apparaat. Het is echter directioneel (afhankelijk van de LED-opening en het geïmplementeerde IR-afschermingssysteem), wat in sommige toepassingen erg handig kan zijn!
Binnenkort zal ik een video uploaden waar je enkele voorbeelden kunt zien van de toepassingen die ik heb gemaakt. Genieten van!
Aanbevolen:
Schakel LED in via internet [MagicBlocks]: 10 stappen
Schakel LED in via internet [MagicBlocks]: deze tutorial leert je om LED op je Magicbit te bedienen met behulp van Magicblocks
Schrijven naar een OLED-scherm via Bluetooth: 6 stappen
Schrijven naar een OLED-scherm via Bluetooth: dit project is geïnspireerd en een remix van Arduino LCD-schermbediening via Bluetooth Inleiding: In dit project gaan we een "Bluetooth OLED." Wat we in dit ontwerp doen, is een Arduino verbinden met een OLED en een Bluetooth-modu
Noodstroomvoorziening via USB (3D geprint): 4 stappen (met afbeeldingen)
Emergency USB Power Source (3D Printed): Dit project maakt gebruik van een 12V-batterij, zoals je zou gebruiken voor een voertuig, voor het opladen van USB-apparaten in geval van stroomuitval of kampeertrip. Het is zo eenvoudig als het bevestigen van een USB-autolader op de batterij. Na orkaan Sandy zat ik zonder stroom en
Apparaten bedienen via internet via browser. (IoT): 6 stappen
Apparaten bedienen via internet via browser. (IoT): In deze Instructable zal ik je laten zien hoe je apparaten zoals LED's, relais, motoren etc. via internet via een webbrowser kunt bedienen. En u hebt via elk apparaat veilig toegang tot de bedieningselementen. Het webplatform dat ik hier heb gebruikt, is RemoteMe.org bezoek
Bestanden overdragen via uw LAN via BitTorrent: 6 stappen
Bestanden overdragen via uw LAN via BitTorrent: Soms moet u mogelijk bestanden over een netwerk naar meerdere computers overbrengen. Hoewel je het op een flashstation of cd/dvd zou kunnen zetten, zou je naar elke computer moeten gaan om de bestanden te kopiëren en het kan even duren om alle bestanden te kopiëren (vooral met f