PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mcp23017



Toran
12.09.2019, 13:45
Hallo Zusammen,
derzeit bin ich dabei einen Roboter zu programmieren. Das Steuerelement des Roboters ist ein Raspberry Pi Zero W. Damit ich genügend GPIOS bekomme habe ich zwei MCP23017 gekauft. Diese anzusteuern funktioniert allerdings noch nicht so gut. Ich verstehe nicht was mein Fehler ist, kann mir jemand dabei helfen? An den MCPs sind nur Drehwinkelgeber angeschlossen, die ausgelesen werden müssen. Wenn ich den Code ausführe und die Drehgeber bediene, wird nach wie vor eine 1 ausgegeben (pull up)

Grüße,
Thomas



#include <stdio.h>
#include <stdlib.h>
#include <pca9685.h>
#include <wiringPi.h>
#include <mcp23017.h>
void setup()
{



wiringPiSetup(); //setup of wiringPi lib
mcp23017Setup(PINBASE3,0x20); //setup of mcp23017
mcp23017Setup(PINBASE4,0x70); //setup of mcp23017


pinMode(PINBASE3,INPUT); //encoder 1 of leg 1
pullUpDnControl(PINBASE3,PUD_UP); //pull up encoder
pinMode(PINBASE3+1,INPUT); //encoder 1 of leg 1
pullUpDnControl(PINBASE3+1,PUD_UP); //pull up encoder
pinMode(PINBASE3+2,INPUT); //encoder 2 of leg 1
pullUpDnControl(PINBASE3+2,PUD_UP); //pull up encoder
pinMode(PINBASE3+3,INPUT); //encoder 2 of leg 1
pullUpDnControl(PINBASE3+3,PUD_UP); //pull up encoder
pinMode(PINBASE3+4,INPUT); //encoder 3 of leg 1
pullUpDnControl(PINBASE3+4,PUD_UP); //pull up encoder
pinMode(PINBASE3+5,INPUT); //encoder 3 of leg 1
pullUpDnControl(PINBASE3+5,PUD_UP); //pull up encoder
pinMode(PINBASE3+6,INPUT); //encoder 1 of leg 2
pullUpDnControl(PINBASE3+6,PUD_UP); //pull up encoder
pinMode(PINBASE3+7,INPUT); //encoder 1 of leg 2
pullUpDnControl(PINBASE3+7,PUD_UP); //pull up encoder
pinMode(PINBASE3+8,INPUT); //encoder 2 of leg 2
pullUpDnControl(PINBASE3+8,PUD_UP); //pull up encoder
pinMode(PINBASE3+9,INPUT); //encoder 2 of leg 2
pullUpDnControl(PINBASE3+9,PUD_UP); //pull up encoder
pinMode(PINBASE3+10,INPUT); //encoder 3 of leg 2
pullUpDnControl(PINBASE3+10,PUD_UP); //pull up encoder
pinMode(PINBASE3+11,INPUT); //encoder 3 of leg 2
pullUpDnControl(PINBASE3+11,PUD_UP); //pull up encoder
pinMode(PINBASE3+12,INPUT); //encoder 1 of leg 3
pullUpDnControl(PINBASE3+12,PUD_UP); //pull up encoder
pinMode(PINBASE3+13,INPUT); //encoder 1 of leg 3
pullUpDnControl(PINBASE3+13,PUD_UP); //pull up encoder
pinMode(PINBASE3,INPUT); //encoder 1 of leg 1
pullUpDnControl(PINBASE3,PUD_UP); //pull up encoder
pinMode(PINBASE3+1,INPUT); //encoder 1 of leg 1
pullUpDnControl(PINBASE3+1,PUD_UP); //pull up encoder
pinMode(PINBASE3+2,INPUT); //encoder 2 of leg 1
pullUpDnControl(PINBASE3+2,PUD_UP); //pull up encoder
pinMode(PINBASE3+3,INPUT); //encoder 2 of leg 1
pullUpDnControl(PINBASE3+3,PUD_UP); //pull up encoder
pinMode(PINBASE3+4,INPUT); //encoder 3 of leg 1
pullUpDnControl(PINBASE3+4,PUD_UP); //pull up encoder
pinMode(PINBASE3+5,INPUT); //encoder 3 of leg 1
pullUpDnControl(PINBASE3+5,PUD_UP); //pull up encoder
pinMode(PINBASE3+6,INPUT); //encoder 1 of leg 2
pullUpDnControl(PINBASE3+6,PUD_UP); //pull up encoder
pinMode(PINBASE3+7,INPUT); //encoder 1 of leg 2
pullUpDnControl(PINBASE3+7,PUD_UP); //pull up encoder
pinMode(PINBASE3+8,INPUT); //encoder 2 of leg 2
pullUpDnControl(PINBASE3+8,PUD_UP); //pull up encoder
pinMode(PINBASE3+9,INPUT); //encoder 2 of leg 2
pullUpDnControl(PINBASE3+9,PUD_UP); //pull up encoder
pinMode(PINBASE3+10,INPUT); //encoder 3 of leg 2
pullUpDnControl(PINBASE3+10,PUD_UP); //pull up encoder
pinMode(PINBASE3+11,INPUT); //encoder 3 of leg 2
pullUpDnControl(PINBASE3+11,PUD_UP); //pull up encoder
pinMode(PINBASE3+12,INPUT); //encoder 1 of leg 3
pullUpDnControl(PINBASE3+12,PUD_UP); //pull up encoder
pinMode(PINBASE3+13,INPUT); //encoder 1 of leg 3
pullUpDnControl(PINBASE3+13,PUD_UP); //pull up encoder
pinMode(PINBASE3+14,INPUT); //encoder 2 of leg 3
pullUpDnControl(PINBASE3+14,PUD_UP); //pull up encoder
pinMode(PINBASE3+15,INPUT); //encoder 2 of leg 3
pullUpDnControl(PINBASE3+15,PUD_UP); //pull up encoder



}
int main()
{
setup();
while(1)
{

for(int i=PINBASE3;i<PINBASE3+16;i++)
{
delay(500);
printf("%d) %d\n",i,digitalRead(i));
}


}
}

Ceos
12.09.2019, 14:05
sieht zumindest erstmal richtig aus

leg dir doch mal das ergebnis von digitalRead vorher in eine 2te variable, eventuell hat der aufruf nebeneffekte

hast du geprüft ob deine ausgänge auch alle entsprechend auf low gehen? also open drain anschlüsse sind? nicht dass deine eingänge einfach permanent auf high fliegen?!

der portexpander sieht auch für meine anwendung gut aus, den werde ich mal bestellen, leider kann ich erst nächste woche ausprobieren

Toran
12.09.2019, 14:20
Okay, ich habe jetzt mal alle auf PULL_DOWN gesetzt und er spuckt mir immer noch dauerhaft 1 aus... meint ihr ich habe was falsch eingestellt?

Ceos
12.09.2019, 17:58
Okay das klingt eher nach einem Kommunikationsfehler

schorsch_76
15.09.2019, 09:31
Welche I2C Adressen hast du den beiden Expandern gegeben? 0x20 + 0x70 erscheint mir nicht ganz richtig.

Die beiden Expander müssen über die Adresspins unterschiedliche Adressen bekommen. Ich vermute du willst 0x20 und 0x21 verwenden.
Kannst du die Ausgabe von
sudo i2cdetect -y 1 zeigen?

34397