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 :
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);}