Soru:
PWM kullanarak dokunmatik ekran girişini simüle etme
Kyohack
2015-04-16 01:38:01 UTC
view on stackexchange narkive permalink

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

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);}  
Aynı şeyi bir Nintendo DSi ile yapmaya çalışıyorum, burada izleyeceğim :)
Arduino'nun Y + Çıktısını neden izlemek istiyorsunuz?
@Austin Burk Hangi Arduino Kartını kullanıyorsunuz?
Bir Arduino Uno kullanıyorum.
Y + pinini izliyorum çünkü 3DS konsolu dekunukem'in belgelerine göre dokunmatik ekran kesintisini o pin üzerinde gönderiyor: https://github.com/dekuNukem/3xtDS/blob/master/overview.pdf Anladığım kadarıyla biraz kullanıyor Dokunmatik ekran için dört iğneden yalnızca ikisini kullanarak bunun çalışmasını sağlamak için bir hile. 3DS'nin bunun gibi standart bir 4 telli dirençli dokunmatik ekran kullandığına inanıyorum: https://www.sparkfun.com/datasheets/LCD/HOW%20DOES%20IT%20WORK.pdf
Kodda hata görmüyorum. Teensy panonuz varsa, Igor Stoppa'nın size söylediği şeyi yapın, eğer hata PWM frekansından kaynaklanmıyorsa, o zaman koda bir kez daha bakacağım.
Osiloskobunuz var mı? Bunu yaparsanız, PWM'den Analog'a dönüştürücüden sonra gelen analog çıkışı kontrol edin. Aynı zamanda bir Elektronik hatası da olabilir.
Arduino kartınızda kaç tane boş pin var? 10 veya daha fazlasına sahipseniz ve 5BIT hassasiyetini kullanmaktan çekinmiyorsanız, herhangi bir elektronik arıza için bir çözümüm var.
@Mathsman100 PWM frekansının bir sorun olduğunu göz ardı edebilmek için genç olmaya karar verdim. Orijinal teensy şemalarını ve dekunukem'in GitHub sayfasındaki kodu kullanırken bile şans yok. Maalesef elimde bir osiloskop yok, ancak bir tane almayı düşünüyorum. Arduino'mda 17 pim var. Simüle etmeye çalıştığım (320x240 çözünürlüğe sahip) dokunmatik ekran için 5bit hassasiyet çok büyük bir doğruluk kaybı olur, ancak sorun gidermek için bir fikriniz varsa 5bit'i denemekten çekinmem. Voltaj çıkışlarını doğrulamak için bir multimetre kullanarak bazı temel sorun giderme işlemleri yaptım.
Temel olarak sorun, hızlı bir Mikroişlemci kullanılıyorsa, PWM'den Analog'a hiçbir zaman düzgün çalışmadığı için ADC'nin hatalı okumaları okuması olabilir.
Yardıma ihtiyacınız olursa veya OP-AMP DAC (OP-AMP DAC ( 5to8-BIT, mümkünse 8BIT kullanabilirsiniz, ancak sonuçları anlatmak için 5 veya 6) öneririm.
OP-AMP için besleme olarak 1.8V kullanmayı ve sinyali OpAmp girişinden önce Dirençlere göndermeden önce 5V'u 1.8 volta dönüştürmeyi unutmayın. (Bunun için Voltaj bölücüler yerine tercihen transistörler kullanın.)
Arabellek Görüntüsü için Bağlantı: [Buffer] (http://www.circuitstoday.com/wp-content/uploads/2011/11/voltage-follower-using-transistor.png)
Lütfen Dikkat: Bunu sadece sorun giderme amacıyla söylüyorum, bu amacınıza hizmet etmeyebilir.
Bir cevap:
Igor Stoppa
2015-04-23 11:15:04 UTC
view on stackexchange narkive permalink

Analizinizi, sorunun Arduino'daki daha düşük pwm frekansından kaynaklandığını doğrulamak için, sorunu teensy ile yeniden oluşturmayı denediniz mi? Teensy'deki PWM frekansını 3'e bölün ve Arduino ile yaşadığınız sorunları yaşayıp yaşamadığınızı görün.

Evet, yakın zamanda özellikle bu projede sorun gidermek için bir teensy 3.1 satın aldım ve maalesef aynı sonucu aldım. Bu beni çok şaşırttı, çünkü dekunukem belgelerinde bahsettiğim aynı elektrik şemasını ve kodu kullandım. Bu noktada, denemediğim tek şey, dekunukem'in kullandığı 2 pinli istismar yerine dokunmatik ekranın tüm 4 pinini kullanmak: https://www.sparkfun.com/datasheets/LCD/HOW%20DOES%20IT % 20WORK.pdf


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...