pin expander aansturen (mcp23016)

Arduino specifieke Software
Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

pin expander aansturen (mcp23016)

Berichtdoor Nald » 16 Okt 2012, 16:49

hallo,

Inmiddels heb ik 2 projecten volledig afgerond op de arduino, nu wil ik deze samenvoegen. Helaas heeft de arduino te weinig pinnen voor de doeleinden waarvoor ik hem wil gebruiken. Dus ik heb een pinexpander aangeschaft.

Na wat tutorials bekeken te hebben heb ik nu gedeeltelijk door hoe ik hem aan moet sturen

Op de arduino is het zo dat als er aan meerdere voorwaarden wordt voldaan dat hij beide voorwaarden tegelijkertijd uitvoert. (als input 1 hoog, 4 hoog - als input 2 hoog, 5 hoog- input 1 en 2 hoog, 4 en5 hoog)

Maar als ik dit voor elkaar wil krijgen met de pin expander dan moet ik gaan werken met if statements. Want zover ik weet, lukte het mij alleen door een code te sturen welke pinnen hoog moeten zijn en welke pinnen laag moeten zijn. De expander voegt 2 commands niet samen.

Hoe moet ik dit oplossen? Is het mogelijk om een enkele pin aan te sturen en de rest met rust (open) te laten?

Hoe sturen jullie de pinexpander aan? Ik gebruik onderstaande voorbeeldcode van iprototype (volgens mij staat er in de uitleg een boel fouten).
Code: Alles selecteren
#include <Wire.h>;
#include <inttypes.h>;

void setup()
{
  Wire.begin(); //Initialisatie van de wire klasse
 
  /*
      -- initialisatie --
      De eerste twee commands die naar de MCP23016 gestuurd worden, zet de poorten als input of als output.
      Een command bestaat altijd uit 2 x 8 bits. (met de functie setData worden de twee bitreeksen als hexadecimaal verstuurd)
      De eerste 8 bits geeft aan welk command gestuurd word (in de initialisatie 00000110 (0x06) en 00000111 (0x07), dit zijn de commands IODIR0 en IODIR1)
      De tweede 8 bits geven aan welke poorten input zijn en welke output (0 = output, 1 = input)
      Bijvoorbeeld:
        sendData(0x06, 0x00); //binair 00000110, 00000000 //Zet alle 8 poorten op GP0 op output
        sendData(0x07, 0x05); //binair 00000111, 00000101 //Zet poort 1 en 3 van GP1 op input, de rest op output
  */
 
  sendData(0x06, 0x00); //binair 00000110, 00000000 //Zet alle 8 poorten op GP0 op output
  sendData(0x07, 0x00); //binair 00000111, 00000000 //Zet alle 8 poorten op GP1 op output
}

void loop()
{
  /*
      -- poorten hoog of laag toewijzen --
      Het command om te schrijven naar de poorten is 00000000 (0x00) voor GP0, 00000001 (0x01) voor GP1
      De tweede 8 bits geven aan welke poorten hoog zijn en welke laag (0 = laag, 1 = hoog)
      Bijvoorbeeld:
        sendData(0x00, 0x04); //binair 00000000, 00000100 //Zet poort 3 van GP0 op hoog, de rest laag
        sendData(0x01, 0x02); //binair 00000000, 00000010 //Zet poort 2 van GP0 op hoog, de rest laag
       
        23 = GP0.2
        24 = GPO.3
  */
  sendData(0x00, 0x04); //binair 00000000, 00000100 //zet poort 2 van GP0 hoog, de rest laag, pin 23 van de MCP23016 (GP0.2)
 
  delay(500); //wacht 500 ms
 
  sendData(0x00, 0x08); //binair 00000000, 00001000 //zet poort 3 van GP0 hoog, de rest laag, pin 24 van de MCP23016 (GP0.3)
 
  delay(500); //wacht 500 ms
}

void sendData(uint8_t byte1, uint8_t byte2)
{
  Wire.beginTransmission(0x20);
  Wire.write(byte1);
  Wire.write(byte2);
  Wire.endTransmission();
}

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: pin expander aansturen (mcp23016)

Berichtdoor pjh » 17 Okt 2012, 11:53

Je kunt de commando's volgens mij gewoon optellen
0x08 + 0x04 = 0x0C

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: pin expander aansturen (mcp23016)

Berichtdoor Nald » 17 Okt 2012, 14:29

C? wat betekend dit? en hoe moet ik dit toepassen?

ik heb 8 knopen op mijn schakeling zitten, als ik die allemaal compleet uit moet schrijven dan kom ik op 40320 if mogelijkheden.

Gebruikers-avatar
Berichten: 188
Geregistreerd: 23 Dec 2011, 00:12

Re: pin expander aansturen (mcp23016)

Berichtdoor Duality » 17 Okt 2012, 16:06

8 knoppen is 2^8 mogelijkheden 256 mogelijkheden.

die C is 12 in decimaal.
want: je werkt hier met een 16 tallig systeem, omdat het tien tallig systeem dat wij gebruiken geen apparte cijfers heeft voor 11 en 12 etc,
in hexidecimaal is het:
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15

dus 0x0F = 15
en 0x10 = 16

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: pin expander aansturen (mcp23016)

Berichtdoor Nald » 17 Okt 2012, 19:28

Dank je voor je reactie, maar kan ik elke pin apart aansturen zonder alle andere pinnen uit te zetten?

want de jouw 256 voorgestelde mogelijkheden vind ik nog steeds veel. (256 klopt volgens mij ook niet)

Ene koenwar heeft een library gemaakt voor de betreffende pin-expander, waar hij elke pin individueel aanstuurt, dus het is mogelijk.
Ik kan alleen de library niet implementeren, omdat ik een foutcode krijg over de commands "recieve" en "send"

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: pin expander aansturen (mcp23016)

Berichtdoor pjh » 18 Okt 2012, 00:06

foutcode krijg over de commands "recieve" en "send"

Sinds de Arduino IDE naar versie 1.0 ging, zijn "recieve" en "send" veranderd in read en write. Je zult zien dat als je deze veranderd, de foutmeldingen weg gaan. Je kunt trouwens in de sketch(Arduino IDE) met CONTROL-F een zoek en vervangopdracht opgeven. Je moet de rode foutcodes maar eens goed lezen. Deze geven veel informatie over wat er mis gaat bij het compileren. Lees ze en google het.

Verder is het echt zo dat 8 bits een maximaal decimaal getal van 255 kan geven. Dit raakt de essentie van de digitale wereld.
Misschien is het goed in dit kader een paar zaken te noemen die je waarschijnlijk niet kent.

Eerst even de loop uit je sketch:
Code: Alles selecteren
{
  sendData(0x00, 0x04); //zet poort 2 van GP0 hoog
  delay(500); //wacht 500 ms
  sendData(0x00, 0x08); //zet poort 3 van GP0 hoog
  delay(500); //wacht 500 ms
}


Om de beurt gaan poort 2 en 3 500 ms op hoog.
De MCP23016 heeft 2 x 8 bits poorten. Dus eigenlijk 9 bits.
Hierkun je dus 2^9 combinaties mee maken. Immers:
=> met elke bit meer, verdubbel je het aantal mogelijkheden.
8 bits kent daarom 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 = 256 combinaties

Hier staat de eerste GPIO en de laatste aan:
Code: Alles selecteren
{
  sendData(0x00, 0x81); //zet poort 1 en 8 van GP0 hoog. Is decimaal 129
}


Je kunt het ook gewoon binair opschrijven met een hoofdletter 'B' en acht enen of nullen:
Code: Alles selecteren
{
  sendData(B00000000, B10000001); //zet poort 1 en 8 van GP0 hoog
}


De Microcontroller herkent alleen machinetaal. Hexadecimale nummers zijn handig, omdat het met enen en nullen zo lang wordt. Tochkun jeuit een hexadecimaalnummer direct afleiden waar de enen en nullen staan.

Onder windows kun je de standaard rekenmachine ook op "programmeren" zetten. Daarmee kun je eenvoudig een decimaal naar een hexadecimaal of binair FORMAAT omzetten.
Afbeelding

Gebruikers-avatar
Berichten: 188
Geregistreerd: 23 Dec 2011, 00:12

Re: pin expander aansturen (mcp23016)

Berichtdoor Duality » 19 Okt 2012, 02:25

De MCP23016 heeft 2 x 8 bits poorten. Dus eigenlijk 9 bits.


2x8 = 16 ?

die library van koenwar is een aan rader! die heb ik voor een deel gebruikt om een library te schrijfen waar je met de mcp23016 een lcd kan aansturen :)
http://tkkrlab.nl/wiki/Lcd_through_IOexpander
https://github.com/Duality4Y/IOlcd

mag ik vragen wat je eigenlijk precies voor een error krijgt :)? meschien moet de library van koen waar nog aangepast worden voor 1.0 && > (1.0 en nieuwere versies)

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: pin expander aansturen (mcp23016)

Berichtdoor Nald » 25 Okt 2012, 16:33

Ik heb de laatste dagen geen tijd gehad om de antwoorden uit te proberen. Maar hier even het antwoord op de laatste vraag:

ps. krijg de library niet werkend op 1.01 als op 1.00. en hoe kan ik in de library komen om dit aan te passen?

hierbij de code op 1.0 met de voorbeeldcode pinexpander:
Code: Alles selecteren
#include <IOexpander.h>
#include <Wire.h>;
#include <inttypes.h>;

IOexpander IOexp;


void setup()
{
  Serial.begin(9600);
  Serial.println("IOexpander example");

 
  if(IOexp.init(0x20, MCP23016))
    Serial.println("Communication with IOexpander works!");
  else
    Serial.println("No communication with the IOexpander!!"); 

  pinMode(13,OUTPUT);
  IOexp.pinModePort(0,OUTPUT);
  IOexp.pinModePort(1,INPUT);
}

int sw = 0;
int x = 100;
long next = 1000;
long next2 = 1000;


void loop()
{
  //blinks port 0.7 to 0.4
 
  if(millis() >= next){
    IOexp.digitalWritePort(0,LOW);
    switch(sw){
      case 0:
        IOexp.digitalWrite(0,4,HIGH);
        sw++;
        break;
      case 1:
        IOexp.digitalWrite(0,5,HIGH);
        sw++;
        break;
      case 2:
        IOexp.digitalWrite(0,6,HIGH);
        sw++;
      break;
      case 3:
        IOexp.digitalWrite(0,7,HIGH);
        sw= 0;
        Serial.print("next = ");Serial.println(next,DEC); 
      break;
      default:
        sw= 0;
        break;
    }
    next = millis() + x;
  }
 
  //check the buttons on de IO expander
  if(millis() >= next2){
    if(IOexp.digitalRead(1,0)){
      digitalWrite(13,HIGH);
      x = 30;
    }else {
      x = 100;
      digitalWrite(13,LOW);
    }
    next2 = millis() + 50;
  }
}


foutmeldingen bij 1.0

C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:34:22: error: WProgram.h: No such file or directory
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::init(uint8_t, uint8_t)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:67: error: 'INPUT' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::pinMode(uint8_t, uint8_t, bool)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:97: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:98: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:99: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::pinModePort(uint8_t, bool)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:126: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:127: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:128: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::digitalWritePort(uint8_t, bool)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:140: error: 'B00000000' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:142: error: 'B00000000' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'int IOexpander::digitalRead(uint8_t, uint8_t)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:192: error: 'LOW' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:197: error: 'HIGH' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:199: error: 'HIGH' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:201: error: 'LOW' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::sendData()':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:207: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:208: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:209: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::refresh()':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:221: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:226: error: 'class TwoWire' has no member named 'receive'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:227: error: 'class TwoWire' has no member named 'receive'

foutmeldingen bij 1.0.1.

C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:34:22: error: WProgram.h: No such file or directory
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::init(uint8_t, uint8_t)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:67: error: 'INPUT' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::pinMode(uint8_t, uint8_t, bool)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:97: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:98: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:99: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::pinModePort(uint8_t, bool)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:126: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:127: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:128: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::digitalWritePort(uint8_t, bool)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:140: error: 'B00000000' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:142: error: 'B00000000' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'int IOexpander::digitalRead(uint8_t, uint8_t)':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:192: error: 'LOW' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:197: error: 'HIGH' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:199: error: 'HIGH' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:201: error: 'LOW' was not declared in this scope
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::sendData()':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:207: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:208: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:209: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp: In member function 'bool IOexpander::refresh()':
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:221: error: 'class TwoWire' has no member named 'send'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:226: error: 'class TwoWire' has no member named 'receive'
C:\Users\Documents\Arduino\libraries\IOexpander\IOexpander.cpp:227: error: 'class TwoWire' has no member named 'receive'

Gebruikers-avatar
Berichten: 188
Geregistreerd: 23 Dec 2011, 00:12

Re: pin expander aansturen (mcp23016)

Berichtdoor Duality » 25 Okt 2012, 23:26

nald ik heb toevalig die library zelf aangepast. zal ik de aangepaste source hier posten :)?

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: pin expander aansturen (mcp23016)

Berichtdoor Nald » 26 Okt 2012, 13:12

Ik ben zeker geinteresseerd! maar deze library zorgt ervoor dat de pinexpander hetzelfde werkt als de arduino?

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten