How to get the full state of an arduino digital pin ?

This snippet display the full state of an arduino digital pin :

input / output

PWM

Value

void state ( int pin ) {

  uint8_t bit = digitalPinToBitMask(pin);
  uint8_t port = digitalPinToPort(pin);
  volatile uint8_t *reg = portModeRegister(port);

  Serial.print( "------- State of pin ");
  Serial.print( pin );
  Serial.println( " -------");

  if (*reg & bit) {
    // This is an output

    Serial.println( "Pin mode is output" );

    uint8_t timer = digitalPinToTimer(pin)  ;

    if (timer != NOT_ON_TIMER ) {
      Serial.println( "It as a PWM pin");
      Serial.print( "timer : " );
      Serial.println( timer , DEC);

      int timerstate = bitRead( TCCR0A , COM0B1 );
      if ( timerstate == 0 ) {
        Serial.println( "PWM is off");
        uint8_t bit = digitalPinToBitMask(pin);
        uint8_t port = digitalPinToPort(pin);
        if (*portInputRegister(port) & bit) {
          Serial.println( "Output is HIGH" );
        }
        else {
          Serial.println( "Output is LOW" );
        }
      }
      else {
        Serial.println( "PWM is on");
        Serial.print( "OCR0B : " );
        Serial.println( OCR0B , DEC);
      }
    }
  }

  else {
  // This is an input
  Serial.println( "Pin mode is input" );
  if ( digitalRead( pin ) ) {
    Serial.println( "Output is HIGH" );
  }
  else {
    Serial.println( "Output is LOW" );
  }

}

Configurer Gedit comme IDE pour développer sur deux arduino simultanément

L’idée est donc d’utiliser un autre IDE, Gedit et d’indiquer dans l’entête du sketch, la carte cible (modèle et port série) sous la forme :

//BOARD uno
//PORT /dev/ttyUSB0
  • Télécharger et décompresser https://github.com/sudar/Arduino-Makefile
  • Modifier la cible upload du fichier Arduino
upload: $(TARGET_HEX) verify_size
 $(call arduino_output,Resetting Arduino...)
 $(RESET_CMD)
 $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ARD_OPTS) $(AVRDUDE_UPLOAD_HEX)
  • Activer le plugin External tools de Gedit
  • Dans Gedit créer les deux actions build et upload

Build :

#!/bin/sh
BOARD=`grep "//BOARD" $GEDIT_CURRENT_DOCUMENT_NAME | cut -d" " -f2`
LIBS=`grep "//LIBS" $GEDIT_CURRENT_DOCUMENT_NAME | cut -d" " -f2-`
echo $BOARD
echo $LIBS
ARDUINO_LIBS="$LIBS" make -f /data/perso/arduino/makefile/Arduino.mk[/code]

Upload :

#!/bin/sh
BOARD=`grep "//BOARD" $GEDIT_CURRENT_DOCUMENT_NAME | cut -d" " -f2`
PORT=`grep "//PORT" $GEDIT_CURRENT_DOCUMENT_NAME | cut -d" " -f2`
LIBS=`grep "//LIBS" $GEDIT_CURRENT_DOCUMENT_NAME | cut -d" " -f2-`
echo $BOARD
echo $LIBS
BOARD_TAG="$BOARD" MONITOR_PORT="$PORT" ARDUINO_LIBS="$LIBS" make -f /data/perso/arduino/makefile/Arduino.mk upload

Donc au début de chaque sketch, il faut ajouter ces lignes :

//BOARD uno
//PORT /dev/ttyACM0
//LIBS SPI RadioHead

ou

//BOARD nano328
//PORT /dev/ttyUSB0
//LIBS SPI RadioHead

Dans //LIBS, il faut mettre les librairies externes.

Dans une seule instance Gedit, on peut donc développer deux sketch simultanément pour deux cartes différentes.

SparkFun Logic Level Converter – Bi-Directional Fritzing part

Based on the Sparkfun Logic Level Converter part.

Logic Level Converter Bi-directional Fritzing part