Je porte un projet d'un microcontrôleur adolescent vers l'arduino. Le projet utilise essentiellement un microcontrôleur pour simuler l'entrée de l'écran tactile pour la console Nintendo 3DS. Je fais cela en débranchant le numériseur à écran tactile de ma Nintendo 3DS et en remettant mon arduino à sa place. Voir le lien ci-dessous pour le code original de l'adolescence et les schémas que j'essaie de modifier. (L'image de l'oscilloscope ci-dessous est également le crédit de l'auteur du code teensy) https://github.com/dekuNukem/3xtDS
Ceci est un écran tactile assez générique I J'essaie de simuler l'entrée pour, donc je ne suis pas sûr de ce qui ne va pas. Je ne suis pas sûr si mon schéma a un problème, ou si la limitation de fréquence PWM de l'Arduino est le problème. Le code teensy a été configuré pour sortir à 90khz, tandis que le plus élevé que je puisse définir mon arduino est d'environ 31khz. Je pense que cela devrait être suffisant car je pense que la Nintendo 3DS n’échantillonne qu’à des intervalles d’environ 100 microsecondes.
Ce que j'ai fait:
- Je connecte deux de mes broches arduino aux broches X + et Y + où se trouvait le numériseur d'écran tactile Nintendo.
- J'ai utilisé un diviseur de tension pour changer la tension de sortie de l'arduino de 5v à 1.8v, qui est le VCC de l'appareil nintendo.
- J'ai utilisé un condensateur de 0,22 uf et une résistance de 1k comme DAC pour changer la sortie PWM en analogique.
J'ai essayé le dépannage en:
- en utilisant 68 résistances & 120 ohms dans mon diviseur de tension pour une réponse PWM analogique plus fluide, au lieu de 68k résistances & 120k
- ajout d'une diode 1N914 entre le condensateur et la masse (puisque j'utilise des condensateurs en céramique, qui sont bidirectionnels)
- en éliminant le
while (analogRead (senseY) < 46)
ligne dans mon code et à la place en utilisant un délai statique de 100 microsecondes
Appuyez sur l'écran tactile Je veux simuler (le jaune est Y +, le bleu est X +):
Mon schéma :
Code Teensy porté sur arduino:
// J'ai inclus la fonction setPwmFrequency () répertoriée sur le site arduino, // mais je l'omets ici pour des raisons de clarté. // Le principal changement entre le Teensy et l'arduino est que l'adolescent utilise // un logiciel pour abaisser la tension PWM de 3,3 V natif de l'adolescent au 1,8 V de // nintendo, alors que j'ai à la place utilisé un diviseur de tension sur la sortie PWM // de l'arduino.// X + broche de l'écran tactile.int touchX = 9; // Y + broche de l'écran tactile.int touchY = 10; // Pin pour surveiller la sortie d'arduino de Y + int senseY = 11; void setup () {// -Changez les broches 9 et 10 pour avoir une fréquence PWM de 31 250 Hz. C'est le // le plus élevé que je puisse définir. Teensy avait initialement réglé sa fréquence à 90 kHz. // Ma différence de fréquences PEUT être la cause de mes problèmes. // J'ai choisi les broches 9 et 10 car elles n'affecteront pas le timing pour millis () // et delay. setPwmFrequency (9, 1); setPwmFrequency (10, 1); // Le code original de l'adolescence définit la résolution d'écriture analogique sur 9 bits. // Cela était nécessaire car l'écran tactile de la nintendo est de 320x240, ce qui est supérieur à 255 pour une résolution de 8 bits. // Cependant, cette perte de précision mineure ne me dérange pas! La résolution analogique d'arduino est assez précise pour moi. 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) {// Calculez la valeur PWM à écrire en fonction des coordonnées xy de l'écran tactile que nous voulons. unsigned int x_potential = ((double) x / 320) * 255; unsigned int y_potential = ((double) y / 240) * 255; // Démarre la sortie de la valeur x. analogWrite (touchX, x_potentiel); // Tirez Y + à la terre. enable_touch_screen (); unsigned int début = millis (); // Maintenez l'écran tactile enfoncé pendant la durée du tap. while (millis () - start < duration_ms) {// attendre que la broche Y + soit en mode de sortie // code original de teensy vérifié pour 512, ce qui était la moitié de la valeur maximale 1024.
// nous produisons 1.8v avec notre circuit, mais la lecture analogique à 5v // donc la valeur que nous vérifions est la moitié de cette valeur maximale: 1,8 / 5 * 255 = 92 // J'aurais pu utiliser Aref d'arduino, mais math est plus rapide que le soudage while (analogRead (senseY) < 46) delayMicrosecondes (490); // maintenant la broche Y + est en mode de sortie analogWrite (touchY, y_potential); delayMicrosecondes (180); // tirez à nouveau Y + vers le bas pour continuer à interrompre enable_touch_screen (); } disable_touch_screen (); analogWrite (touchX, 0); delay (50);} void disable_touch_screen () {analogWrite (touchY, 255);} // tirez la broche Y + vers le bas pour initialiser l'interruption tactile de 3DS enable_touch_screen () {analogWrite (touchY, 0);} // la routine de boucle s'exécute et encore une fois pour toujours: void loop () {delay (800); // tap à 150x150 pendant 100ms.touch_screen_click (150, 150, 100); delay (800); // tap à 50x50 pendant 100ms.touch_screen_click (50, 50, 100);}