Question:
Simulation de l'entrée d'écran tactile à l'aide de PWM
Kyohack
2015-04-16 01:38:01 UTC
view on stackexchange narkive permalink

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 : enter image description here

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);}  
J'essaye de faire la même chose avec une Nintendo DSi, je vais regarder ici :)
Pourquoi souhaitez-vous surveiller la sortie Arduino de Y +?
@Austin Burk Quelle carte Arduino utilisez-vous?
J'utilise un Arduino Uno.
Je surveille la broche Y + car la console 3DS envoie l'interruption de l'écran tactile sur cette broche, selon la documentation de dekunukem: https://github.com/dekuNukem/3xtDS/blob/master/overview.pdf D'après ce que je comprends, il utilise un peu d'un hack pour que cela fonctionne en utilisant seulement deux des quatre broches pour l'écran tactile. Je crois que la 3DS utilise un écran tactile résistif à 4 fils standard tel que celui-ci: https://www.sparkfun.com/datasheets/LCD/HOW%20DOES%20IT%20WORK.pdf
Je ne vois aucune erreur dans le code. Si vous avez une carte adolescente, faites ce que Igor Stoppa vous dit, si le défaut n'est pas dû à la fréquence PWM, alors je vais revoir le code.
Avez-vous un oscilloscope? Si vous le faites, vérifiez la sortie analogique qui vient après le convertisseur PWM vers analogique. Cela pourrait aussi être une faute électronique.
Combien de broches libres avez-vous sur votre carte Arduino? Si vous en avez 10 ou plus, et que cela ne vous dérange pas d'utiliser la précision 5BIT, j'ai une solution pour tout défaut électronique.
@Mathsman100 J'ai décidé d'avoir une adolescence pour pouvoir exclure que la fréquence PWM soit un problème. Pas de chance, même en utilisant les schémas et le code originaux de l'adolescence de la page GitHub de dekunukem. Malheureusement, je n'ai pas d'oscilloscope sous la main, mais j'envisage d'en obtenir un. J'ai 17 broches libres sur mon arduino. Une précision de 5 bits serait une énorme perte de précision pour l'écran tactile que j'essaie de simuler (qui a une résolution de 320x240), mais cela ne me dérange pas d'essayer 5 bits si vous avez une idée à résoudre. J'ai déjà effectué un dépannage de base à l'aide d'un multimètre pour vérifier les sorties de tension.
Fondamentalement, le problème pourrait être que l'ADC lit des lectures erronées car le PWM à analogique ne fonctionne jamais correctement si vous utilisez un microprocesseur rapide.
Utilisez ce [lien] (http://hyperphysics.phy-astr.gsu.edu/hbase/electronic/dac.html) pour référence et commenter ici si vous avez besoin d'aide, ou après avoir essayé d'utiliser un OP-AMP DAC ( 5to8-BIT, vous pouvez utiliser 8BIT si possible, mais je recommande 5 ou 6) pour indiquer les résultats.
N'oubliez pas d'utiliser 1,8V comme alimentation pour l'OP-AMP et de convertir le 5V en 1,8 volt avant d'envoyer le signal aux résistances avant l'entrée de l'OpAmp (utilisez de préférence des transistors pour cela, au lieu de diviseurs de tension).
Lien pour l'image tampon: [Buffer] (http://www.circuitstoday.com/wp-content/uploads/2011/11/voltage-follower-using-transistor.png)
Remarque: je ne dis ceci que pour le dépannage, cela peut ne pas servir votre objectif.
Un répondre:
Igor Stoppa
2015-04-23 11:15:04 UTC
view on stackexchange narkive permalink

Pour confirmer votre analyse selon laquelle le problème est causé par la fréquence pwm inférieure sur l'Arduino, avez-vous essayé de reproduire le problème avec l'adolescent? Divisez simplement par 3 la fréquence PWM sur le Teensy et voyez si vous rencontrez les mêmes problèmes que vous rencontrez avec l'Arduino.

Oui, j'ai récemment acheté un teensy 3.1 spécialement pour le dépannage de ce projet et j'ai malheureusement le même résultat. Cela me déroute grandement, car j'ai utilisé exactement le même schéma électrique et le même code énumérés dans la documentation de dekunukem auxquels je faisais référence. À ce stade, la seule chose que je n'ai pas essayée est d'utiliser les 4 broches de l'écran tactile plutôt que juste l'exploit à 2 broches utilisé par dekunukem: https://www.sparkfun.com/datasheets/LCD/HOW%20DOES%20IT % 20WORK.pdf


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...