Touchspanel am AVR

dimmu

Neues Mitglied
11. Juli 2011
54
0
0
Schömberg bei Neuenbürg
Sprachen
  1. BascomAVR
Hallo Leute,

aus aktuellem Anlass stelle ich jetzt mal mein nächstes Projekt vor. Ich hoffe es kommen ein paar Tipps bzw Anregungen ob und wie das Ganze zu Lösen ist.

Nun mal zur eigentlichen Problemstellung. Es geht um einen Raum, dieser hat ca. 100qm an Größe und soll als Speiseraum einer Gaststätte dienen. Gewünscht ist eine Möglichkeit alle Lichter von einer zentralen Stelle zu schalten. Außerdem sind auch Zentralfunktionen Gewünscht.

Im Ganze geht es um 12-14 Lichter die geschaltet werden sollen. Von der Stelle wo geschaltet wird zu dem Unterverteiler wo die ganzen Relais sind gibt es glücklicherweise ein Telefonkabel in dem noch 6 Drähte frei sind. Mein Plan ist es nun im Unterverteiler Schieberegister einzubauen, die dann mit 3 Drähten mit dem AVR hinter der Schaltstelle verbunden sind. Somit kann ich relativ unkompliziert über 3 Drähte problemlos die Relais ansteuern. Ich denke mal, dass die Relais so träge sind, dass eine Änderung der Seriellen Daten nicht gleich zum Abfallen der Relais führt.

als Bedienstelle selber schwebt mir jetzt ein Lowcost Tochpanel vor. Ich habe mal etwas im Internet gesucht und habe dass hier gefunden

http://www.cartft.com/catalog/gl/73

Der Plan ist, ein Bild auf dem der Grundriss vom Raum dargestellt ist hinter dieses Panel zu legen. Auf dem Plan sollen dann alle Lampen die geschaltet werden können abgebildet sein. Ich denke ein Feedback ob die Lampe an ist, würde sich über eine LED die hinter dem Bild liegt realisieren. Ich denke die LED sollte so hell leuchten, dass es zu sehen ist.
Vielleicht soll auch noch das ganze Bild hinterleuchtet werden. Das muss ich noch austesten. Sollte eine Beleuchtung nötig sein will ich dass mit LED Streifen machen. Evtl. dann sogar so dass die entsprechend der Raumhelligkeit gedimmt werden.

Momentan hänge ich etwas an dem Punkt wie ich das Panel mit dem AVR verbinden soll. Leider ist auf der Seite nicht so recht zu erkennen um was für eine Technik es sich Handelt. Was ich aber vom Verkäufer erfahren konnte ist, dass es sich wohl um ein Widerstandspanel handelt.

Bei diesen Typen gibt es zwei Flächen an denen eine Spannung angelegt wird. Je nach dem an welcher Stelle sich die Flächen beim Drücken berühren wird dann ein Spannungsteiler gebildet. Über die höhe der Spannung soll dann errechnet werden können wo die Berührung liegt.

Ich habe bereits eine Schaltung gefunden die erklärt wie der Anschluss zu erfolgen hat

http://www.mikroe.com/downloads/get/466/de_mikroe_article_basic_avr_01_09.pdf

Ebenso würde es aber auch fertige IC's geben die zb. über RS232 die Koordinaten an den AVR liefern.

z.B. http://www.reichelt.de/AR-1011/3/index.html?&ACTION=3&LA=446&ARTICLE=137264&artnr=AR+1011&SEARCH=touchscreen

So nun seit ihr dran. Was haltet ihr von der Idee. Denkt ihr es ist so umsetzbar?
Ein paar bedenken habe ich bezüglich der Genauigkeit. Wie schätzt ihr das ein, ist das auf Dauer sicher, dass das Panel immer die gleichen Koordinaten liefert bei Berührung.
Bestellt sind bist jetzt noch keine Teile. Vielleicht hat von euch jemand schon mal was ähnliches gemacht un kann ein paar Erfahrungen mitteilen.

Danke
 
Gehen sollte das. Da ich grad irgendwie nicht an Deine Links rankomme, kann ich dazu nichts sagen...

Ich hatte mal so'n GLCD von EA verwendet, mit Thouchscreen-Folie (resistiv) drauf.
attachment.php

Da hatte ich einfach 'ne Spannung auf die eine Dimension gelegt, und die andere auf den ADC. Gemessen, und danach mit vertauschten Dimensionen die andere.
Die Ergebnisse müßten dann verrechnet werden (Offset subtrahieren, und mehrfach durch 2 teilen (schieben), bis die gewünschte Auflösung erreicht ist. damit erschlägst Du dann das Problem, pixelgenau tippen zu müssen.

Bei dem externen Controller erreichst Du mit dem Teilen sicher dasselbe -> Datenblatt anschauen
 
Hallo,

so es geht weiter.

Auf dem Bild ist die zukünftige Einteilung der Köpfe zu sehen
Hintergrund_Gesamt.PNG

die Rechteckigen Knöpfe ganz links sollen später mit einem Text beschriftet werden. Z.B Flutlicht, oder Hoflicht. Einfach all die dinge die nicht auf dem Grundrissplan zu sehen sind. Die Knöpfe von der Mitte an nach Rechts, also die Quadratischen sollen später mal Lichter werden. Es werden voraussichtlich nicht alle belegt werden, aber der Plan ist trotzdem für jeden Knopf einen Ausgang zu haben. Das hat dann später mal den Vorteil, wenn sich etwas ändert muss nicht jedes mal umprogrammiert werden, sondern nur umgeklemmt.

Wie erwähnt sollen die Ausgänge über Schieberegister realisiert werden. Zufälligerweise sind in jeder Reihe 8 Knöpfe. Somit ergibt passt immer eine Reihe in ein Schieberegister. Also werde ich nacher 6 Schieberegister benötigen.

Einen ersten Codeentwurf habe ich auch schon geschrieben.
Code:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 42


'####Pins

'Ausgänge
'##Umschaltung X/Y
Config Portb.0 = Output
Drive_x Alias Portb.0
Config Portb.1 = Output
Drive_y Alias Portb.1
'##PWM
Config Portb.2 = Output
Portb.2 Alias Pwm
'PortB.6 = Xtal
'PortB.7 = Xtal
'##Anzeige
Config Portd.3 = Output
Have_x Alias Portd.3
Config Portd.4 = Output
Have_y Alias Portd.4
'##Schieberegister
Config Portd.5 = Output
Ds Alias Portd.5
Config Portd.6 = Output
St_cp Alias Portd.6
Config Portd.7 = Output
Sh_cp Alias Portd.7

'Eingänge
'##ADC
Config Pinc.0 = Input
Read_x Alias Pinc.0
Config Pinc.1 = Input
Read_y Alias Pinc.1
Config Pinc.2 = Input
Hell Alias Pinc.2
'Pinc.6 = Reset


'####Variablen
Dim X_coord As Word                                         'Enthält den ADC Wert der X-Achse
Dim X_coord_2 As Word                                       'Vergleich um Kontroll LED zu schalten
Dim Y_coord As Word                                         'Enthält den ADC Wert Der Y-Achse
Dim Y_coord576 As Word                                      'Y_Achse Korriegiert auf 576 Pixel
Dim Y_coord576_2 As Word                                    'Vergleich um Kontroll LED zu schalten

Dim Eingabe As Byte                                         'Enthält den gerdückten Button auf der X Achse
Dim X(6) As Byte                                            'Array um die Matrix Paralell auszugeben
Dim Y As Byte                                               'Enthält die gedrückte Achse
Dim Ausgabe As Double                                       'Enthält die Paralelle Ausgabe


'#### ADC
Config Adc = Single , Prescaler = Auto
Start Adc

'####Hauptprogramm


Do

Gosub Get_x
   If X_coord > 0 And X_coord < 224 Then                    'Prüfen ob Butten 1
   Eingabe = &B00000001
   Elseif X_coord > 224 And X_coord < 448 Then              'Prüfen ob Butten 2
   Eingabe = &B00000010
   Elseif X_coord > 448 And X_coord < 544 Then              'Prüfen ob Butten 3
   Eingabe = &B00000100
   Elseif X_coord > 544 And X_coord < 640 Then              'Prüfen ob Butten 4
   Eingabe = &B00001000
   Elseif X_coord > 640 And X_coord < 736 Then              'Prüfen ob Butten 5
   Eingabe = &B00010000
   Elseif X_coord > 736 And X_coord < 832 Then              'Prüfen ob Butten 6
   Eingabe = &B00100000
   Elseif X_coord > 832 And X_coord < 928 Then              'Prüfen ob Butten 7
   Eingabe = &B01000000
   Elseif X_coord > 928 And X_coord > 1024 Then             'Prüfen ob Butten 8
   Eingabe = &B10000000
   End If

Gosub Get_y
   If Y_coord > 0 And Y_coord < 96 Then                     'Prüfen ob Zeile 1
   Y = &B00000001
   Elseif Y_coord > 96 And Y_coord < 192 Then               'Prüfen ob Zeile 2
   Y = &B00000010
   Elseif Y_coord > 192 And Y_coord < 288 Then              'Prüfen ob Zeile 3
   Y = &B00000100
   Elseif Y_coord > 288 And Y_coord < 384 Then              'Prüfen ob Zeile 4
   Y = &B00001000
   Elseif Y_coord > 384 And Y_coord < 480 Then              'Prüfen ob Zeile 5
   Y = &B00010000
   Elseif Y_coord > 480 And Y_coord < 576 Then              'Prüfen ob Zeile 6
   Y = &B00100000
   End If


X(y) = X(y) Or Eingabe
'Bsp. Butten 4 in Zeile 3 wird gedrückt. Davor war noch nichts gedrückt.
'X(y) wählt also dass X-Array 3 aus
'in X_3 Steht     00000000
'in Eingabe Steht 00001000
'Verodert         00001000
'Als nächstes wird Butten 6 Gedrückt
'in X_3 Steht jetzt 00001000
'in Eingabe steht   00100000
'Verodert           00101000
                              '


Ausgabe = X(1)                                              'Ausgabe zusammensetzten
Shift Ausgabe , Left , 8
Ausgabe = Ausgabe + X(2)
Shift Ausgabe , Left , 8
Ausgabe = Ausgabe + X(3)
Shift Ausgabe , Left , 8
Ausgabe = Ausgabe + X(4)
Shift Ausgabe , Left , 8
Ausgabe = Ausgabe + X(5)
Shift Ausgabe , Left , 8
Ausgabe = Ausgabe + X(6)


Shiftout Ds , Sh_cp , Ausgabe
Set St_cp
Reset St_cp

Loop

'####Gosub
Get_x:
Have_x = 0                                                  'Kontroll Led ausschalten
Drive_x = 1                                                 'X Achse an Spannung anlegen
Drive_y = 0                                                 'Y Achse Spannung abschalten
Waitms 5
X_coord = Getadc(0)                                         'ADC einlesen
   If X_coord <> X_coord_2 Then                             'Kontroll LED einschalten
   Have_x = 1
   X_coord_2 = X_coord
   End If
Return

Get_y:
Have_y = 0
Drive_x = 0
Drive_y = 1
Waitms 5
Y_coord = Getadc(1)
Y_coord576 = Y_coord * 576                                  'Korrektur auf 576 Pixel errechnen
Y_coord576 = Y_coord / 1024
   If Y_coord576 <> Y_coord576_2 Then
   Have_y = 1
   Y_coord576_2 = Y_coord576
   End If
Return
:
Ausprobieren konnte ich ihn noch nicht, da das Panel noch nicht da ist. Aber eigentlich sollte es so funktionieren.

Ein Problem habe ich allerdings noch. Wenn ich richtig liege kann ich mit meinem Cod wie er jetzt aussieht nur das Licht einschalten, und nicht wieder aus.
Hinzu kommt noch, die Rechteckigen Knöpfe auf der linken Seite sollen bei jeder Berührung einmal Pulsen. Hier werden später Stromstoßschalter angeschlossen. Die Quadratischen Knöpfe rechts, sollen bei jedem Druck umschalten. Also erster Druck, Licht ein, Zweiter Druck, Licht aus.

Kann mir da jemand einen Tipp geben wie ich da vorgehen muss.

Danke
 
Wie Du vorgehen mußt, ist allein Deine Sache. Ich kann nur sagen, wie ICH es machen würde. Das hatte ich ja oben schon angedeutet...
Da wird einfach erstmal der Offset korrigiert (und der Status "nix gedrückt" behandelt), und danach die tatsächliche Auflösung der Folie auf die Auflösung der "Buttons" runterdividiert. Geht natürlich mit gleichgroßen Buttons am einfachsten, insbesondere wenn die Anzahl der Buttons in einer Reihe/Spalte 'ne Zweierpotenz ist.
Stell Dir einfach vor, der ADC liefert (nach der Offsetkorrektur) die Werte 0..511, und Du willst da 8 Buttons haben. Dann kannst Du das offsetkorrigierte ADC-Ergebnis einfach durch 64 teilen (6mal rechtsschieben), und hast die Nummer des Buttons als Ergebnis.

Anstelle der Matrix kannst Du Dir die Buttons auch als Reihe interpretieren (reihen- oder zeilenweise durchlaufen), und jedem Button 'ne Zahl zuordnen.
Damit könnte der Master (also der Controller am Panel) den gedrückten Button an alle Slaves übermitteln. Was die Slaves dann damit machen, wäre Sache des jeweiligen Slave-Programmes.

Falls irgendwelche Slider oder sowas realisiert werden sollen, müßte man die vorher abfangen/auswerten.
Zu klären wäre auch, wie die Slaves die Ausführung quittieren sollen, insbesondere wenn mehrere auf denselben Button reagieren können. Kommt da aber auch auf die Struktur des Kommunikationsnetzes an.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)