PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfragen eines Tasters



pmaler
15.08.2007, 10:29
Als erstes... Falls die Frage zu doof erscheint... Ich kenne mich in Elektronik und dergleichen nicht aus. Daher bitte ich um Nachsicht.
Ich "bediente" bisher immer fix und fertig aufgebaute Computer, möchte aber meinen begrenzten Horizont erweitern.

Ich möchte mit einem RN-Modul (RN-Mega128Funk) mehrere Taster (Bumbers) wie im Wiki dargestellt ( https://www.roboternetz.de/wissen/index.php/Sensorarten#Bumpers ) abfragen.

Dort heißt es
Die Auswertung erfolgt am besten digital an einem Pin mit Pull-up Widerstand

So wie ich es (mit laienhaften Verständnis) erahne, muss man einen Wiederstand, mir unbekannter Größe, vorschalten.

Welchen Wiederstandswert und an welche Pins eines RN-Moduls schliesst man das dann an?

Und welche Bascom-Befehle (Oder auch in C, dass ist mir egal) muß man anwenden um den Taster zu "pollen" bzw.. hat jemand einen Link oder ein Beispiel in dem das näher erklärt wird?

Das "warum genau hier" usw. ist im Moment Nebensache. Da werde ich mit der Zeit schon dahinter kommen.

Wäre echt nett von euch.
Danke.

raschky
15.08.2007, 10:42
Hi also mit RN-Boards kenne ich mich nicht aus, weil ich an Elektronik alles selber zusammenlöte ;)

Aber nun zu deinem Problem:

Pull-Up bedeutet, dass der Port-Pin intern schon einen Widerstand gegen VCC besitzt, den due per Software an, oder ausschalten kannst. Sieh dir hierzu mal ein Datenblatt von nem uC an: ATMEGA-Derivate...

Wenn du einen Port-Pin benutzt, der intern keinen Pull-Up besitzt schließt du diesen extern am Port-Pin direkt an VCC an (Widerstandswert für Pull-Up 4k7 ist nur ein Richtwert kann zwischen 1k und 10k liegen)

Für die Programmierung musst du nachdem du den PORT initialisierst,
---
heißt Port als Eingang schalten über Data-Direction-Register-PortX (meißt eine 1 reinschreiben) DDRX genannt, wobei das X für den jeweiligen Port steht
---
eine Endlosschleife in der main-Funktion fahren:

void main (void)
{
while(1)
{
//und hier fragst (pollst) du dann deine Eingänge
unsigned char test = 0;
test = PORTX;
if(test >0)
{
//Auswirkung, welcher Sensor hat geschaltet über Masken prüfen
}
}
}


Ich hoffe ich konnte dir ein wenig weiterhelfen...

Gruß

Thomas

franzl
15.08.2007, 10:43
Hi,
also Pull-up Widerstände sind in den AVR Controllern schon integriert du musst sie nur über DDRX = 0x00; Ports als Eingänge definieren. Und mit PORTX = 0xFF; Pull up Widerstände aktivieren.
Und am besten liest dir das mal durch http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial.
mfg franz

Hubert.G
15.08.2007, 10:47
Diese Frage wird ziemlich am Anfang eines jeden Tutorials behandelt. Hier eines für C : www.mikrocontroller.net/articles/AVR-GCC-Tutorial und noch eines: www.roboternetz.de/wissen/index.php/C-Tutorial
Wenn du schon so ein RN-Modul hast kannst du darauf fast alles ausprobieren.

pmaler
15.08.2007, 10:59
Wow. Das ging echt fix.
Komme mir zwar vor, wie ein Quantenphysiker, der nach der Antwort auf eine Frage 10 neue bekommt, aber es hat mir sehr geholfen.

Was mir noch etwas Sorgen macht...

Ich muss also die VCC über den Schalter direkt an einen der Pins des Controllers anschliessen.

Der Controller muss mit DDRX = 0x00 zum "Eingang" deklariert werden und mit PORTX = 0xFF der Pullup Wiederstand aktiviert werden.

Ich denke jetzt daran, dass es ein Roboterbein ist, an dem der Taster angeschlossen ist. Und das Bein kann im Moment des Systemstarts bereits auf 1 stehen, also der Taster geschlossen.

Die Programmroutine muss aber zuerst alles einstellen. Also liegen bereits... sagen wir mal 12 Volt direkt am Port an.

Hält der AVR das aus?

Durch fehlerhafte Kabel in Verbindung mit parallelen Schnittstellen und anderen Kleinigkeiten, habe ich schon öfter mal Rauch aufgehen lassen. Zuletzt als ich einen Transistor im Experimentierkasten meines Sohnes verbrutzelt hatte. Versuch mach Kluch, aber ...

Ich bin mit den Jahren vorsichtig geworden und frage lieber zuerst mal nach und überlege mir etwas 3 mal bevor ich Bauteile der Müllkippe zuführe :lol:

franzl
15.08.2007, 11:16
Hi,
also an den AVR darfst du nicht mehr als 5V anlegen sonst ist er hinüber. Die Pull ups werden beim initialisieren des Programms also vor dem Beginn des eigentlichen Programms geschalten und haben somit auf das Programm an sich keinen Einfluss mehr.
mfg franz

Hubert.G
15.08.2007, 11:20
12V hält der Kontroller sicher nicht aus, VCC ist im allgemeinen 5V, also die Beitriebsspannung des Kontroller. Der Taster liegt auch an GND und nicht an VCC. In Ruhe, Taster offen, liegt über den PullUp-Widerstand VCC am Eingang, wenn der Taster gedrückt wird, dann liegt GND am Eingang. Bei einem fehlerhaften Kabel kann daher auch kaum etwas passieren.

radbruch
15.08.2007, 11:23
Hallo

Ohne PullUp/PullDown-Widerstand würde der Eingang bei geöffnetem Schalter "in der Luft" hängen, ein gültiger Wert könnte dann nicht eingelesen werden. Deshalb verbindet man den Eingang mit einem hochohmigen Widerstand mit Vcc(PullUp) oder 0V(PullDown). In der Praxis ist ein PullUp günstiger, weil dann der Schalter den Pin gegen 0V verbinden muss und Störimpulse sich nicht auswirken, weil der Pegel des Pins bei nicht betätigtem Schalter sowieso schon auf Vcc liegt. Bei Systemen mit mehreren Versorgungsspannungen kann man dann auch nicht versehentlich eine zu hohe Spannung an den Pin bringen. Deshalb haben die ATMegas auch serienmässig einen PullUp eingebaut, den man bei Bedarf aktivieren kann.

Der Nachteil ist die inverse Logik bei PullUps. Eine "1" bedeutet Schalter geöffnet, am Pin liegen Vcc über PullUp. Eine "0" bedeutet, der Pin ist über den geschlossenen Schalter direkt mit 0V verbunden.

Übrigends fliesst bei geschlossenem Schalter ein kleiner Verluststrom über den PullUp und den Schalter von Vcc nach 0V. Deshalb sollte der Wert des Widerstands nur so klein sein, wie zum Einstellen eines stabilen Pegels am Pin benötigt wird. Bei der Verwendung der internen PullUps liegt man aber meist richtig.

Gruß

mic

pmaler
15.08.2007, 11:55
Oh. Danke.
Wieder Geld gespart, wie es aussieht.:-)

Also niemals VCC irgendwo in die Nähe eines Pins bringen.

Kurze Nebenfrage: Auf den Boards wird ein Spannungswandler verwendet, der anscheinend eine (nahezu) beliebige Spannung auf die benötigten 5 Volt bringt.

Wird dadurch Energie verbraucht?

Beim Durchlesen diverser Threads erkenne ich das Problem der Stromversorgung. Es werden mind. 18 Servos, die sollten etwas größer sein und sind stetig in Bewegung. Das verballert viel Energie.

Dadurch ist jede Sparsamkeit angebracht, damit das Projekt nicht Kabelgebunden laufen soll.

Die Frage ist nicht ganz umsonst, denn die Servos brauchen nicht 12 Volt sondern eben auch 4-5 * 1,2 Volt (Zellengröße aus meiner Modellbauzeit) und ich will nicht verschiedene Batteriepacks (LiPoli) verwenden, sondern nur einen.

Die 12 Volt (oder was auch immer) müssen für die Servos runtergebracht werden. Das ist bestimmt nicht schwer, aber für jemand der es nicht kann und keine Ahnung hat, eine fast unüberwindbare Barriere.

Danke für weitere Hilfe

pmaler
15.08.2007, 12:00
Jetzt habe ich auch den Begriff PullUp / PullDown verstanden. (Oder glaube es zumindest)

Das Problem der inversen Logik ist für mich kein Problem. Das gibts in meiner Welt auch andauern.

Manchmal ist die 1 mit einem True verbunden, manchmal die -1 usw. Ist nur lästig, wenn man zwischen solchen Welten dauernd hin und her"denken" muss.

radbruch
15.08.2007, 15:13
Hallo


Manchmal ist die 1 mit einem True verbunden, manchmal die -1 usw.
Die "1" bedeutet, ein Bit (das LSB) im Wert ist gesetzt, also Wert != 0. Die "-1" bedeutet bei vorzeichenbehafteten Werten, dass im Wert alle Bits gesetzt sind. Also gilt auch hier: Wert !=0. Wirklich verlässlich ist wohl nur false, denn das ist einfach nichts.

Ich glaube, das ist die offizielle Definition:

false=(1==0);
true=!false;

Wenn deine Servos 6V brauchen, warum willst du dann 12V und einen Wandler mitschleppen? Bau einen 6V-Akku (=5*1,2V) für die Servos ein und einen Wandler für die 5V für den Kontroller.

Dessen Versorgungsspannung nennt man übrigends Vcc und die kann er ab, wenn man sie an einem Eingang anlegt (außer ADC mit niedriger Referenz!). Der PullUp macht das ja auch. Er verbindet den Pin mit Vcc. Ubat sollte man meiden...

Gruß

mic

pmaler
15.08.2007, 17:22
Die "1" bedeutet, ein Bit (das LSB) im Wert ist gesetzt, also Wert != 0. Die "-1" bedeutet bei vorzeichenbehafteten Werten, dass im Wert alle Bits gesetzt sind. Also gilt auch hier: Wert !=0. Wirklich verlässlich ist wohl nur false, denn das ist einfach nichts.

Ich glaube, das ist die offizielle Definition:

false=(1==0);
true=!false;


Ich bin einer, der noch den Jurassic Park unter den Computern mit Lochkarten und so weiter, am Rande, mitgemacht hat. Und da kamen mir schon True / False Definitionen unter, ... Na lassen wir das. Mich schüttelt es heute noch ;-)



Wenn deine Servos 6V brauchen, warum willst du dann 12V und einen Wandler mitschleppen? Bau einen 6V-Akku (=5*1,2V) für die Servos ein und einen Wandler für die 5V für den Kontroller.


Das war jetzt eine Vorgabe in der es heißt:

Es reicht eine unstabilisierte Gleichspannung von 7 bis 14V aus (max. 20V wenn ein Kühlkörper verwendet wird)

Beispielhaft zu lesen unter https://www.roboternetz.de/wissen/index.php/RN-Mega8

Verunsichere mich bitte nicht :-)



Dessen Versorgungsspannung nennt man übrigends Vcc


Mea culpa. Bin relativ neu in der ganzen Geschichte. Werde mit Ausdrücken besser aufpassen.

radbruch
15.08.2007, 17:45
Hallo


Spannungsversorgung
Über diese Schraubklemme wird das Board mit Spannung versorgt. Es reicht eine unstabilisierte Gleichspannung von 7 bis 14V aus (max. 20V wenn ein Kühlkörper verwendet wird) + und – sind auf der Platine markiert. Das Board ist jedoch auch gegen ein verpolen geschützt, so das nichts kaputt geht!

Das ist ein Zitat aus der RN-Board-Beschreibung (https://www.roboternetz.de/wissen/index.php/RN-Mega8) und bezieht sich auch auf dieses. Von 18 Servos schreiben die nichts.

Gruß

mic

Hubert.G
15.08.2007, 18:31
Servos in größerer Anzahl kann man über die Mikro Seriell Servoboards anschließen. Sie Stromversorgung bei 18 Servo ist schon zu überdenken, so ein Servo kann leicht mal 500mA ziehen, wenn das 6 zur gleichen Zeit machen dann tut sich was.

pmaler
15.08.2007, 18:56
Vielleicht sollte ich dazu sagen, dass ich folgendes Szenario Plane
1. Mechanik. Na was sonst.
2. angesteuert durch servos und nicht motoren, also etwas Bausteinhaftes, wo man Teile sozusagen ersetzen kann gegen stärkere Servos.
3. zur Ansteuerung der Servos mehrere Boards des Typ´s Micro Servoboard [FEPOLSERV]
4. Zentrale Steuereinheit das RN-Mega128Funk - Controllerboard mit Funkmodul [bsmit128f]
5. auf PC-seite das RN-Funk [BSRNFUNK]

Eventuell noch Zusatzboards in weiterer Ausbaustufe

Als erster Schritt kommt die Mechanik mit den Servos dran, welche mit den Servoboards gesteuert werden. Anfangs direkt mit dem PC via RS232. Ich habe diesbezüglich ein Board aus Amiland von NetMedia vor zig-Jahren gekauft und schreibe damit die Grundlagen fest zur Ansteuerung und der Kommunikation zur Seriellen.
Ausserdem teste ich da meine Servos, die noch massenhaft aus meiner Pilotenzeit im Keller liegen.

Sobald die Mechanik steht, und die Grunddaten zur Ansteuerung der Servogruppen in Datenmodule verpackt fertig sind, gehts an die Funkübertragung mit dem Mega128Funk. Die Steuerung soll auch der Mega128 übernehmen und die reinen Funktionsdaten (Bewegungsabläufe) der Beine nur noch als Codeblöcke zum Mega128 vom PC kommen.

Beispiel: Der Mega128 soll wissen, welche Bewegungsabläufe ein Bein machen kann und die Sinn machen. Das soll er sich auch selbst anlernen können, bzw. gewisse Bewegungsabläufe ändern wenn notwendig. Ein Bein hat 3 Achsen, also sind 3 Servos zu koordinieren um (sagen wir mal) Zustand 0x0001 einzustellen. Der PC sendet dann nur noch Bein 0x01 -> Zustand 0x0003 usw. Zurück müssen natürlich dann Positionszustände, eventuelle Tasterzustände usw.

Es muss sozusagen das Rückgrad den Reflex so nahe wie möglich und so schnell wie möglich erledigen, das "wohin" und die Infos der Umgebung sollen vom PC gehalten werden.

Einfach nur eine Krabbelmaschine, dass ist mir zuwenig. Wenn schon, dann soll die Maschine etwas lernen können.

Ich will aber nichts Neues erfinden, sondern zumindest dass schaffen, was auf diversen Webseite bereits als funktionierende "Walkingmachine" existiert und dabei die selbstständige Überwindung von Hindernissen schafft.

Unterm Strich mache ich es so wie mit ganz normalen Programmen, ich zerlege das Problem in einzelne Komponenten. Überlege mir die Problematiken und suche nach Lösungen, die noch im Finanziellen Rahmen bleiben und vor allem, was andere bereits einsetzen und das 100% funktioniert. Dann setze ich die Bausteine zusammen und wenn ich vorher alles ordentlich überlegt habe, dann sollte es laufen.

Daher frage ich vorher und lese mich in diverse Techniken ein, bevor ich die erste Schraube ansetze oder den ersten Lötpunkt verpatze :-)

Die Planung eines solchen Projektes ist eins der wichtigsten Teile, daher ... ich habe ja noch Zeit und bin nicht auf der Flucht. ;-) Aber es bringt mir persönlich etwas, was mir keiner mehr nehmen kann, Wissen, Erfahrung, Spaß. Und ich finde, lernen hält jung

pmaler
15.08.2007, 19:02
Servos in größerer Anzahl kann man über die Mikro Seriell Servoboards anschließen. Sie Stromversorgung bei 18 Servo ist schon zu überdenken, so ein Servo kann leicht mal 500mA ziehen, wenn das 6 zur gleichen Zeit machen dann tut sich was.


Ja eben. Ich bin mir nicht sicher, wie ich die Stromversorgung ordentlich gewährleisten soll.

Eigene Batterien für die Servos? Das ist etwas, was ich sogar schon damals bei meinem Airwolf-Helicopter machte. Also Steuerleitungen vom Empfänger und eigene Batterie für die Servos des Landegestells usw.

Deswegen suche ich im Moment nach jemandem, der diesbezüglich schon (schlechte) Erfahrungen machte.

Möchte nämlich (aus Gewohnheit) Digitalservos verwenden. Und die Zwitschern schon ohne Last vor sich hin und verbrauchen Energie