- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 2 von 2

Thema: Raspi GPP C++ WiringPi: Rotationsencoder auslesen

  1. #1
    HaWe
    Gast

    Beitrag [erledigt] Raspi GPP C++ WiringPi: Rotationsencoder auslesen

    Anzeige

    Powerstation Test
    [erledigt]

    Hallo,
    ich bin jetzt erst 1 knappe Woche auf dem Raspi unterwegs (vorher Arduino) und bin daher mit der Verkabelung und der Programmierung noch unsicher.
    Ich habe aktuell Arduino-Code für Rotationsencoder auf Raspi portiert, nun bin ich unsicher wegen Pullups oder Vorwiderständen, und ich möchte ungern einen Kurzschluss verursachen.


    Meine Fragen:
    Meine encoderpins habe ich im Prinzip wie INPUT_PULLUP bei Arduino initialisiert - sind jetzt die Pullups korrekt dazugeschaltet?

    Code:
      pinMode(encoderPin1, INPUT);  // attach pullup resistor !
      pinMode(encoderPin2, INPUT);  // attach pullup resistor !
    
      pullUpDnControl(encoderPin1, PUD_UP); // Enable pull-up resistor on encoder pin 
      pullUpDnControl(encoderPin2, PUD_UP); // Enable pull-up resistor on encoder pin
    Muss ich beim Raspi zusätzlich Vorwiderstände dazuschalten? (Beim Arduino ist das nicht nötig)

    Hier ist die vorangegangene Arduino-Schaltung:
    http://www.multiwingspan.co.uk/arduino.php?page=rotary2

    Bild hier  


    letzte Frage (vorläufig):
    Die Pinchange-Interrupts sind irgendwie nirgends vernünftig dokumentiert und erklärt - habe ich das so richtig gemacht ?


    Code:
      // ISR init
      if (wiringPiISR (encoderPin1, INT_EDGE_FALLING, &updateEncoder) < 0)  {
        fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
        return 1 ;
      }
      if (wiringPiISR (encoderPin2, INT_EDGE_FALLING, &updateEncoder) < 0)  {
        fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
        return 1 ;
      }


    Perfekt wäre es natürlich, wenn jemand bereits getesteten Code kennt bzw. benutzt, um hier nicht Anfängerfehler zu machen die schwer zu entdecken und auszumerzen sind.



    Code:
    /*
     
     ***********************************************************************
     * This file is part of wiringPi:
     * https://projects.drogon.net/raspberry-pi/wiringpi/
     *
     *
     *    You should have received a copy of the GNU Lesser General Public License
     *    along with wiringPi.  If not, see <http://www.gnu.org/licenses/>.
     ***********************************************************************
     */
    
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <wiringPi.h>  // -I/usr/local/include -L/usr/local/lib -lwiringPi
    
    
    int encoderPin1 = 2;
    int encoderPin2 = 3;
    
    volatile int  lastEncoded  = 0;
    volatile long encoderValue = 0;
    
    volatile long lastencoderValue = 0;
    
    int lastMSB = 0;
    int lastLSB = 0;
    
    
    /*
     * ISR updateEncoder:
     *********************************************************************************
     */
    
    void updateEncoder (void)
    {
      int MSB = digitalRead(encoderPin1);       //MSB = most significant bit
      int LSB = digitalRead(encoderPin2);       //LSB = least significant bit
      
      int encoded = (MSB << 1) |LSB;            //converting the 2 pin value to single number
      int sum  = (lastEncoded << 2) | encoded;  //adding it to the previous encoded value
    
      if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
      if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
    
      lastEncoded = encoded;                    //store this value for next time
    }
    
    
    /*
     *********************************************************************************
     * main
     *********************************************************************************
     */
    
    int main (void)
    {
    
      // setup  
      if (wiringPiSetup () < 0)  {
        fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ;
        return 1 ;
      }
      
      pinMode(encoderPin1, INPUT);  // attach pullup resistor !
      pinMode(encoderPin2, INPUT);  // attach pullup resistor !
    
      pullUpDnControl(encoderPin1, PUD_UP); // Enable pull-up resistor on encoder pin 
      pullUpDnControl(encoderPin2, PUD_UP); // Enable pull-up resistor on encoder pin
      
    
      // ISR init
      if (wiringPiISR (encoderPin1, INT_EDGE_FALLING, &updateEncoder) < 0)  {
        fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
        return 1 ;
      }
      if (wiringPiISR (encoderPin2, INT_EDGE_FALLING, &updateEncoder) < 0)  {
        fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
        return 1 ;
      }
    
      
    
      // loop
      
      for (;;)  {    
        printf ("%3d: %6ld\n",  1, encoderValue);
        delay(100);
      }
    
      return 0 ;
    }
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken rot_bb.png  
    Geändert von HaWe (18.10.2015 um 10:30 Uhr)

  2. #2
    HaWe
    Gast
    hat sich erledigt, es war im Prinzip alles OK!

Ähnliche Themen

  1. [C, C++] GPIO lib: pigpio oder WiringPi?
    Von HaWe im Forum Raspberry Pi
    Antworten: 0
    Letzter Beitrag: 15.10.2015, 18:19
  2. [ERLEDIGT] Raspi Club?
    Von pofoklempner im Forum Raspberry Pi
    Antworten: 16
    Letzter Beitrag: 09.07.2015, 07:20
  3. Antworten: 39
    Letzter Beitrag: 24.07.2014, 21:37
  4. RasPi mit RN-Schrittmotor und Pegelwandler
    Von Crashmichl im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 27.01.2014, 23:23
  5. Rotationsencoder AS5046 einsetzen
    Von i-wizard im Forum Sensoren / Sensorik
    Antworten: 0
    Letzter Beitrag: 15.12.2008, 18:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests