Küçük bir mikrodenetleyiciden arduino'ya bir projeyi aktarıyorum. Esasen proje, Nintendo 3DS konsolu için dokunmatik ekran girişini simüle etmek için bir mikro denetleyici kullanıyor. Bunu, Nintendo 3DS'imin dokunmatik ekran sayısallaştırıcısını çıkararak ve arduino'mu yerine koyarak yapıyorum. Değiştirmeye çalıştığım orijinal teensy kodu ve şemaları için aşağıdaki bağlantıya bakın. (Aşağıdaki osiloskop resmi aynı zamanda teensy kodunun yazarına aittir) https://github.com/dekuNukem/3xtDS
Bu oldukça genel bir dokunmatik ekrandır I için girişi simüle etmeye çalışıyorum, bu yüzden neyin yanlış gittiğinden emin değilim. Şemamın bir sorunu olup olmadığından veya Arduino'nun PWM frekans sınırlamasının sorun olup olmadığından emin değilim. Teensy kodu 90khz'de çıkacak şekilde ayarlandı, arduino'mu muhtemelen ayarlayabildiğim en yüksek değer 31khz civarında. Bunun yeterince olması gerektiğine inanıyorum çünkü Nintendo 3DS'nin yalnızca yaklaşık 100 mikrosaniye aralıklarla örneklediğine inanıyorum.
Yaptığım şey:
- Arduino pinlerimden ikisini Nintendo dokunmatik ekran sayısallaştırıcının olduğu X + ve Y + pinlerine bağlıyorum.
- Arduino'nun çıkış voltajını değiştirmek için bir voltaj bölücü kullandım Nintendo cihazının VCC'si olan 5v'den 1.8v'ye.
- PWM çıkışını analoga çevirmek için DAC olarak 0.22uf kapasitör ve 1k direnç kullandım.
Sorun gidermeyi şu şekilde denedim:
- 68k & 120k dirençler yerine daha yumuşak analog PWM yanıtı için voltaj bölücümde 68 & 120 ohm direnç kullanarak
- kapasitör ile toprak arasına bir 1N914 diyot eklemek (çift yönlü olan seramik kapasitörler kullandığım için)
-
ortadan kaldırılırken (analogRead (senseY) < 46)
kodumdaki satır ve bunun yerine 100 statik gecikme kullan mikrosaniye
Simüle etmek istediğim dokunmatik ekran basın (Sarı Y +, mavi X +):
Şemam :
Arduino'ya taşınan Teensy kodu:
// Arduino sitesinde listelenen setPwmFrequency () işlevini ekledim, // ama netlik nedenlerinden dolayı burada atlıyorum .// Teensy ile arduino arasındaki ana değişiklik, teensy'nin PWM voltajını // teensy'nin doğal 3.3v'den nintendo'nun 1.8v'sine düşürmek için yazılım kullanmasıdır, bunun yerine arduino'nun PWM çıkışında bir voltaj bölücü kullandım .// touchscreen.int touchX'in X + pini; // Y + touchscreen.int touchY = 10; // arduino'nun çıkışını Y + int senseY = 11; void setup () {// -9 ve 10 pinlerini 31,250 hz PWM frekansına sahip olacak şekilde değiştirin. Bu, ayarlayabildiğim en yüksek // //. Teensy başlangıçta frekanslarını 90 khz olarak ayarladı. // Frekanslardaki farkım, sorunlarımın nedeni OLABİLİR. // milis () // ve gecikme için zamanlamayı etkilemeyecekleri için 9 ve 10 pinlerini seçtim. setPwmFrequency (9, 1); setPwmFrequency (10; 1); // Orijinal teensy kodu, analog yazma çözünürlüğünü 9 bit'e ayarladı. // Bu gerekliydi çünkü nintendo dokunmatik ekranı 320x240, yani 8 bit çözünürlük için 255'ten daha büyük. // Ancak, bu küçük doğruluk kaybını önemsemiyorum! arduino'nun analog çözünürlüğü benim için yeterince doğru. 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) {// İstediğimiz xy dokunmatik ekran koordinatlarına göre yazılacak PWM değerini hesaplayın. işaretsiz int x_potential = ((double) x / 320) * 255; işaretsiz int y_potential = ((double) y / 240) * 255; // x değerini çıkarmaya başlayın. analogWrite (touchX, x_potential); // Y + 'yı yere çekin. enable_touch_screen (); işaretsiz int başlangıç = milis (); // Dokunma süresi boyunca dokunmatik ekranı basılı tutun. while (millis () - Başlat < süresi_ms) {// Y + pin çıkış moduna geçene kadar bekle // orijinal teensy kodu 512 için kontrol edildi, bu maksimum 1024 değerinin yarısı kadardı.
// devremizle 1.8v çıkış yapıyoruz, ancak 5v'de analog okuyorum // böylece kontrol ettiğimiz değer bu maksimum değerin yarısı: 1.8 / 5 * 255 = 92 // ARDUINO'NUN Aref'ini kullanmış olabilirim, ancak matematik (analogRead (senseY) < 46) gecikmeliMicroseconds (490) iken lehimlemeden daha hızlıdır; // artık Y + pin çıkış modunda analogWrite (touchY, y_potential); gecikme Mikrosaniye (180); // kesmenin devam etmesi için Y + 'yı tekrar aşağı çekin enable_touch_screen (); } disable_touch_screen (); analogWrite (touchX, 0); delay (50);} void disable_touch_screen () {analogWrite (touchY, 255);} // 3DS'nin touch interruptvoid'i başlatmak için Y + pini düşük çekin enable_touch_screen () {analogWrite (touchY, 0);} // döngü rutini üzerinden çalışır sonsuza kadar tekrar tekrar: void loop () {delay (800); // 100ms için 150x150'ye dokunun.touch_screen_click (150, 150, 100); delay (800); // 100ms için 50x50'ye dokunun.touch_screen_click (50, 50, 100);}