Vraag:
Touchscreen-invoer simuleren met behulp van PWM
Kyohack
2015-04-16 01:38:01 UTC
view on stackexchange narkive permalink

Ik port een project van een piepkleine microcontroller naar de Arduino. In wezen gebruikt het project een microcontroller om touchscreen-invoer voor de Nintendo 3DS-console te simuleren. Ik doe dit door de touchscreen-digitizer van mijn Nintendo 3DS los te koppelen en mijn arduino op zijn plaats te zetten. Zie de onderstaande link voor de originele tienercode en schema's die ik probeer te wijzigen. (De afbeelding van de oscilloscoop hieronder is ook de eer van de auteur van de tienercode) https://github.com/dekuNukem/3xtDS

Dit is een vrij algemeen touchscreen dat ik Ik probeer input te simuleren voor, dus ik weet niet zeker wat er mis gaat. Ik weet niet zeker of mijn schema een probleem heeft, of dat de PWM-frequentiebeperking van de Arduino het probleem is. De piepkleine code is ingesteld om uit te voeren op 90khz, terwijl de hoogste die ik mijn Arduino kan instellen rond de 31khz is. Ik vind dat dit goed genoeg zou moeten zijn, omdat ik geloof dat de Nintendo 3DS alleen samples maakt met intervallen van ongeveer 100 microseconde.

Wat ik heb gedaan:

  • Ik verbind twee van mijn Arduino-pinnen met de X + en Y + -pinnen waar de touchscreen-digitizer van Nintendo was.
  • Ik heb een spanningsdeler gebruikt om de uitgangsspanning van de Arduino te veranderen van 5v naar 1.8v, de VCC van het Nintendo-apparaat.
  • Ik heb een 0.22uf condensator en 1k weerstand gebruikt als een DAC om de PWM-uitgang naar analoog te veranderen.

Ik heb geprobeerd het probleem op te lossen door:

  • 68 & 120 ohm-weerstanden te gebruiken in mijn spanningsdeler voor een soepeler analoge PWM-respons, in plaats van 68k & 120k-weerstanden
  • het toevoegen van een 1N914-diode tussen de condensator en aarde (aangezien ik keramische condensatoren gebruik, die bidirectioneel zijn)
  • het elimineren van de while (analogRead (senseY) < 46) regel in mijn code en gebruik in plaats daarvan een statische vertraging van 100 microseconden

Touchscreen-pers die ik wil simuleren (geel is Y +, blauw is X +):

Mijn schema : enter image description here

Teensy-code geport naar arduino:

  // Ik heb de functie setPwmFrequency () opgenomen op de arduino-site, // maar ik laat het hier om duidelijkheidsredenen weg. // De belangrijkste verandering tussen de Teensy en Arduino is dat de teensy // software gebruikt om de PWM-spanning te verlagen van de oorspronkelijke 3.3v van teensy naar de // nintendo's 1.8v, terwijl ik in plaats daarvan een spanningsdeler heb gebruikt op de PWM // output van de arduino. // X + pin van touchscreen.int touchX = 9; // Y + pin van touchscreen.int touchY = 10; // Pin om de output van Arduino te bewaken Y + int senseY = 11; void setup () {// -Verander pinnen 9 en 10 om 31.250 hz PWM-frequentie te hebben. Dit is de // hoogste die ik kan instellen. Teensy heeft hun frequentie oorspronkelijk ingesteld op 90 kHz. // Mijn verschil in frequenties kan de oorzaak zijn van mijn problemen. // Ik heb pinnen 9 en 10 gekozen omdat ze geen invloed hebben op de timing van millis () // en vertraging. setPwmFrequency (9, 1); setPwmFrequency (10, 1); // Originele tienercode heeft de analoge schrijfresolutie ingesteld op 9 bits. // Dit was nodig omdat het touchscreen van de Nintendo 320x240 is, wat groter is dan 255 voor een 8-bits resolutie. // Ik vind dit kleine nauwkeurigheidsverlies echter niet erg! De analoge resolutie van arduino is voor mij nauwkeurig genoeg. pinMode (touchX, OUTPUT); pinMode (touchY, OUTPUT); analogWrite (touchX, 0); disable_touch_screen ();} void touch_screen_click (unsigned int x, unsigned int y, unsigned int duration_ms) {// Bereken de te schrijven PWM-waarde op basis van de xy touchscreen-coördinaten die we willen. unsigned int x_potential = ((dubbel) x / 320) * 255; unsigned int y_potential = ((dubbel) y / 240) * 255; // Begin met het uitvoeren van de x-waarde. analogWrite (touchX, x_potential); // Trek Y + naar de grond. enable_touch_screen (); unsigned int start = millis (); // Houd het aanraakscherm ingedrukt voor de duur van de tik. while (millis () - start < duration_ms) {// wacht tot Y + pin in uitvoermodus is // originele tienercode gecontroleerd op 512, wat de helft was van de maximale waarde 1024.
// we voeren 1.8v uit met ons circuit, maar lezen analoog op 5v // dus de waarde die we controleren is de helft van deze maximale waarde: 1.8 / 5 * 255 = 92 // Ik had de Aref van arduino kunnen gebruiken, maar wiskunde is sneller dan solderen terwijl (analogRead (senseY) < 46) delayMicroseconds (490); // nu bevindt Y + pin zich in de uitvoermodus analogWrite (touchY, y_potential); delayMicroseconds (180); // trek Y + weer naar beneden om de onderbreking door te laten gaan enable_touch_screen (); } disable_touch_screen (); analogWrite (touchX, 0); delay (50);} void disable_touch_screen () {analogWrite (touchY, 255);} // trek Y + pin laag om de aanraakonderbreking van 3DS te initialiseren. void enable_touch_screen () {analogWrite (touchY, 0);} // de looproutine loopt over en opnieuw voor altijd: void loop () {delay (800); // tik op 150x150 voor 100 ms. touch_screen_click (150, 150, 100); vertraging (800); // tik op 50x50 voor 100 ms. touch_screen_click (50, 50, 100);}  
Ik probeer hetzelfde te doen met een Nintendo DSi, ik zal hier kijken :)
Waarom wil je de Arduino-output van Y + monitoren?
@Austin Burk Welk Arduino-bord gebruik je?
Ik gebruik een Arduino Uno.
Ik bewaak de Y + pin omdat de 3DS-console de touchscreen-interrupt op die pin verzendt, volgens de documentatie van dekunukem: https://github.com/dekuNukem/3xtDS/blob/master/overview.pdf Voor zover ik begrijp, gebruikt hij een beetje van een hack om dit te laten werken door slechts twee van de vier pinnen voor het touchscreen te gebruiken. Ik geloof dat de 3DS een standaard 4-draads resistief touchscreen gebruikt, zoals dit: https://www.sparkfun.com/datasheets/LCD/HOW%20DOES%20IT%20WORK.pdf
Ik zie geen fouten in de code. Als je een tienerbord hebt, doe dan wat Igor Stoppa je zegt, als de fout niet te wijten is aan de PWM-frequentie, dan zal ik de code nog eens bekijken.
Heeft u een oscilloscoop? Als u dat doet, controleer dan de analoge uitgang die na de PWM naar analoog-omzetter komt. Het kan ook een elektronicafout zijn.
Hoeveel gratis pinnen heb je op je Arduino-bord? Als je er 10 of meer hebt en het niet erg vindt om 5BIT-precisie te gebruiken, heb ik een oplossing voor elke elektronicafout.
@Mathsman100 Ik besloot om een ​​teensy te nemen, zodat ik kon uitsluiten dat de PWM-frequentie een probleem was. Geen geluk, zelfs niet met behulp van de originele piepkleine schema's en code van de GitHub-pagina van dekunukem. Helaas heb ik geen oscilloscoop bij de hand, maar ik overweeg er een aan te schaffen. Ik heb 17 pinnen gratis op mijn Arduino. 5-bits precisie zou een enorm nauwkeurigheidsverlies zijn voor het touchscreen dat ik probeer te simuleren (met een resolutie van 320x240), maar ik vind het niet erg om 5-bits te proberen als je een idee hebt om het probleem op te lossen. Ik heb al wat basisproblemen opgelost met een multimeter om de spanningsuitgangen te verifiëren.
In wezen kan het probleem zijn dat de ADC foutieve metingen leest, aangezien de PWM naar analoog nooit goed werkt bij gebruik van een snelle microprocessor.
Gebruik deze [link] (http://hyperphysics.phy-astr.gsu.edu/hbase/electronic/dac.html) ter referentie en geef hier commentaar als je hulp nodig hebt, of nadat je een OP-AMP DAC hebt geprobeerd ( 5to8-BIT, je zou indien mogelijk 8BIT kunnen gebruiken, maar ik raad 5 of 6) aan om de resultaten te vertellen.
Denk eraan om 1.8V te gebruiken als voeding voor OP-AMP en de 5V om te zetten naar 1.8 volt voordat je het signaal naar de weerstanden stuurt voor de ingang van de OpAmp. (Gebruik hiervoor bij voorkeur transistors in plaats van spanningsdelers).
Link voor Buffer Image: [Buffer] (http://www.circuitstoday.com/wp-content/uploads/2011/11/voltage-follower-using-transistor.png)
Let op: ik vertel dit alleen voor het oplossen van problemen, dit dient mogelijk niet uw doel.
Een antwoord:
Igor Stoppa
2015-04-23 11:15:04 UTC
view on stackexchange narkive permalink

Heb je geprobeerd het probleem met de tiener te reproduceren om je analyse te bevestigen dat het probleem wordt veroorzaakt door de lagere pwm-frequentie op de Arduino? Deel de PWM-frequentie op de Teensy gewoon door 3 en kijk of je dezelfde problemen krijgt die je ervaart met de Arduino.

Ja, ik heb onlangs een teensy 3.1 gekocht speciaal voor het oplossen van problemen met dit project en ik heb helaas hetzelfde resultaat. Dit verwart me enorm, omdat ik exact hetzelfde elektrische schema en dezelfde code heb gebruikt als vermeld in de documentatie van dekunukem waarnaar ik verwees. Op dit moment is het enige dat ik nog niet heb geprobeerd, alle 4 de pinnen van het touchscreen te gebruiken in plaats van alleen de 2-pins exploit die dekunukem gebruikte: https://www.sparkfun.com/datasheets/LCD/HOW%20DOES%20IT % 20WORK.pdf


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...