PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster für RP6



julianf123
27.11.2009, 14:30
Hallo,

ich würde gernen an meinen RP6 2 - 3 Taster anschließen.
Welche anschlüsse würden sich dafür eignen?
wie viele ports brauche ich dafür ?
wie kann ich außlesen ob ein taster gedrückt ist oder nicht ?

schon mal danke für die hilfe im voraus.

RobotMichi
27.11.2009, 15:16
Hallo,

auf der M32 wären schon fünf Taster drauf. (außer du willst sie selber bauen)

lg
Michi

julianf123
27.11.2009, 15:29
Nein aber ich hätte eigentlich vorgehabt direckt auf den RP6 Taster zubauen

Virus
27.11.2009, 16:13
sollen die taster auf den Erweiterungsflächen vom RP6
oder eine EXP ?

ein taster wird jeweils in reihe mit einem Widerstand geschaltet und dann alle Taster parrallel zueinander.

Dieses gebilde benutzt man zusammen mit einem zweiten wiederstand der konstand bleibt als Spannungsteiler.

auskommen tus du so mit nur einem ADC, eine aussage ob 2taster gleichzeitig gedrückt werden ist nicht möglich, wenn mans so macht.

julianf123
27.11.2009, 18:44
Hallo und vielen dank für die hilfe
ich habs jetzt hinbekommen.
Ich habe mir den schaltpaln von der erweiterung angesschaut und dies nachgebaut (auf eine extra lochplatiene). Danach habe ich alles an ACD 0 angeschlossen. Hab die leibrary datei auf den richtigen port umgeschrieben.
(Hab von der librarydatei vom M32 abgeschaut) :cheesy: :cheesy:
Jetzt funktionierts !!!

julianf123
27.11.2009, 19:26
Hab jetst doch ein problem wenn ich z.b. flogenden progrtammcode
starte, leuchten die LEDs dauernt egal ob ich den taster drück oder nicht.



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
writeString_P("\n\n _______________________\n");
writeString_P(" \\| RP6 ROBOT SYSTEM |/\n");
writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n");
setLEDs(0b000000);
powerON();

while(true)
{
task_RP6System();

uint8_t key = getPressedKeyNumber();

if(key == 1)
{
writeString_P("Bin gedrückt !!!!!!\n");
setLEDs(0b111111);

}
else
{ setLEDs(0);
}

}

return 0;
}

Dirk
28.11.2009, 13:59
Hallo julianf123,

die Funktion "getPressedKeyNumber()" ist ja in der RP6RobotBaseLib nicht vorhanden, weil der RP6 keine "freien" Taster hat. Es hilft auch nicht, die Funktion aus der RP6ControlLib zu kopieren. Man sollte die Libraries auch nicht ändern.

Wenn du den/die Taster mit einem Spannungsteiler an ADC0 des RP6 angeschlossen hast, kannst du sie auch so auslesen, wie in der RP6-Anleitung Seite 90 beschrieben:

uint16_t adc0 = readADC(ADC_ADC0);


Gruß Dirk

julianf123
28.11.2009, 19:00
Ich hab es in eine extra Library kopiert und es auch geändert und ins makefile eingetragen (soweit hat es auch funktioniert und das beispielprogramm jetzt auch), aber wenn ich eine taste drücke (egal welche) es ist immer die taste 1.

Wo habe ich den fehler gemacht ?

Dirk
28.11.2009, 19:14
Ok, dann bleibt nur, dass du mal deine extra Library, dein Hauptprogramm und einen Schaltplan von den Tastern reinstellst!

Gruß Dirk

julianf123
29.11.2009, 18:03
Der fehler war an meinen Liebrarys gelegen.
Aber es funktionirt immer noch nicht.
Ich weiß zwar wie man den port adc 0 ausließt ob eine taste gedrückt ist oder nicht.
Aber ich weiß nicht wie man festelt welche taste gedrückt ist ich hab zwischen jeder taste einen 10 k wiederstand eingefügt.
(unten ist mein Schaltplan)



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();


writeString_P("\n\n _______________________\n");
writeString_P(" \\| RP6 ROBOT SYSTEM |/\n");
writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n");


uint16_t keys;

setLEDs(0b111111);
mSleep(1000);
setLEDs(0b000000);
mSleep(500);

while(true)
{
keys = readADC(ADC_ADC0);
if(keys != 1023);
{
setLEDs(0b111111);
mSleep(1000);
setLEDs(0b000000);
}

}
return 0;
}




kann mir jemand sagen wie ich auslesen kann welche tastegedrückt ist
denn keys ist bei mir immer null egal welche taste ich drücke:


hier mein Schaltpalan:

Dirk
29.11.2009, 18:27
Aber ich weiß nicht wie man festelt welche taste gedrückt ist ich hab zwischen jeder taste einen 10 k wiederstand eingefügt.
Das ist einfach:
Du gibst den Wert von keys für jede der gedrückten Tasten aus.

Angenommen, eine Taste gibt den Wert 230 aus, die nächste 400 und die folgende 570.
Dann errechnest du den Mittelwert zwischen den 3 Tasten, also 315 und 485.
Die Tasten kann man dann mit einer If-Abfrage feststellen:
If (keys < 315) "Taste 1 gedrückt"
If ((keys > 315) && (keys < 485)) "Taste 2 gedrückt"
If ((keys > 485) && (keys < 1000)) "Taste 3 gedrückt"

Gruß Dirk

julianf123
29.11.2009, 18:32
vielen vielen Dank werde das morgen gleich ausßprobieren

julianf123
30.11.2009, 16:31
Bei mir ist aber der wert viel geringer woran kann das liegen ?
zb. Bei taster 1 ungedrückt ist der wert 255 und gedrückt ist der wert 5.

So sieht mein programmcode aus jetzt mal nur für den taster 1.



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();


writeString_P("\n\n _______________________\n");
writeString_P(" \\| RP6 ROBOT SYSTEM |/\n");
writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n");


uint8_t keys;
uint8_t counter;
uint8_t counter1;

setLEDs(0b111111);
mSleep(1000);
setLEDs(0b000000);
mSleep(500);
keys = readADC(ADC_ADC0);
counter = keys;
writeInteger(counter, DEC);
writeString_P("\n\n");
while(true)
{
keys = readADC(ADC_ADC0);
if (keys == 5)
{
counter1 = keys;
writeInteger(counter1, DEC);
setLEDs(0b11111);
mSleep(1000);
setLEDs(0b000000);
}


}
return 0;
}

Virus
30.11.2009, 18:47
in der simulation mit yenka gibt deine schaltung aus:
5;2,5;1,67;1,25 und 1volt.

Sind den alle Widerstände richtig?
wenn ja liegt der Fehler im Programm.

julianf123
30.11.2009, 19:27
Also bei folgenden Programmcode ist die ausgabe von taster 1 immer wieder was anderse 0 - 76 meistens 0 oder 5.
taster 2 hat immer den wert 228 oder 229.
wo könnte ich den fehler bei taster 1 gemacht haben.



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();


writeString_P("\n\n _______________________\n");
writeString_P(" \\| RP6 ROBOT SYSTEM |/\n");
writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n");


uint8_t keys;
uint8_t counter;
uint8_t counter1;
uint8_t counter3;

setLEDs(0b111111);
mSleep(1000);
setLEDs(0b000000);
mSleep(500);
keys = readADC(ADC_ADC0);
counter = keys;
writeInteger(counter, DEC);
writeString_P("\n\n");
while(true)
{
keys = readADC(ADC_ADC0);
if (keys < 100)
{
counter1 = keys;
writeString("Taste 1: \n");
writeInteger(counter1, DEC);
}
if (keys == 229 || keys == 228)
{
counter3 = keys;
writeString("Taste 2: \n");
writeInteger(counter3, DEC);
}


}
return 0;
}

julianf123
02.12.2009, 15:16
Wie viele taster könte ich eigentlich maximal an einen adc port anschließen wenn ich zwischen jeden taster einen 10k wiederstand habe.

Xandi11
02.12.2009, 18:09
... eine Idee wäre zum Beispiel ja auch eine Matrixtastatur.
Man könnte dann auf einer Erweiterungsplatine z.B. 16 Taster unterbringen und diese mit "nur" einem 8poligen Stecker ansteuern.

Dirk
02.12.2009, 20:16
Wie viele taster könte ich eigentlich maximal an einen adc port anschließen ...
Mit Metallfilmwiderständen habe ich 16 Taster geschafft:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=34732
(Siehe mein Beitrag vom 14.10.2007, 20:30)
In dem Beitrag wird auch die Alternative, eine Matrixtastatur beschrieben.

Gruß Dirk

Xandi11
02.12.2009, 20:28
Ich vermute mal, dass das Maximum der Taster in etwas bei 16 liegt. Bei noch mehr müssten ja die Widerstände dann noch viel genauer sein.

Stimmt das ?