Drehgeber an A6 und A7 bei Nano

Hallo, ich möchte einen Drehgeber an Analogeingänge A6 und A7 anschließen. Gibt es dafür eine Librairy?

welches Arduino?

warum möchtest du ausgerechnet A6 und A7 verwenden.
Genau DIE pins zu denen es reichlich Einschränkungen gibt

https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/

Notes and Warnings

The analog input pins can be used as digital pins, referred to as A0, A1, etc. The exception is the Arduino Nano, Pro Mini, and Mini’s A6 and A7 pins, which can only be used as analog inputs.

Also - warum willst du deinen Drehgeber ausgerechnet mit Analog-Input only Pins lesen?

A6 und A7 beim ATmega328 in SMD sind nur analoge Aingänge Sie haben keine andere Funktionalität.
Du könntest höchsten 2 analoge Eingänge, die analog verwendet werden auf A6und A7 wechseln und so 2 andere analoge Eingänge frei bekommen die digital verwendet werden können.

Grüße Uwe

Hallo @uwefed und @noiasca
PinBeschreibung / Pinout ist aber auch erst seit kurzem eindeutig dokumentiert.
Erst gab es ein fehlerhaftes Doku, was die Anzahl der tatsächlichen digital verwendbaren Pins angeht und das Pinout wurde gerade vor ein paar Tagen berichtigt.

Dem TO ist da kein Vorwurf zu machen, wenn er was anders probiert und scheitert :wink:

Einfach weil alle digitale Pins belegt sind. Ich habe 8 digitale Pins für eine 4x4 Tastatur, die ich mit der Mobaltools-Librairy betreibe. Wenn ich dafür A6 und A7 verwende bin ich nicht mehr mit Mobatools kompatibel. Allen übrigen Pins lassen sich nicht durch A6 und A7 tauschen.

Leider habe ich keine frei, denn ich einen 4kanal-I2C-Bus-ADC verwende weil ich sowieso zu wenig analoge Eingänge habe.

Wo finde ich das berichtigte Pinout?

Stückchen runterscrollen

google Bildersuche Arduino nano pinout
https://www.google.de/search?q=arduino%20nano%20pinout&tbm=isch&hl=de&tbs=qdr:m&sa=X&ved=0CAQQpwVqFwoTCLCv7MzJlfYCFQAAAAAdAAAAABAC&biw=1266&bih=625

und dann die Fundstelle anklicken die als url Arduino.cc hat

Wenn du jetzt knapp an IO-pins bist.
Die 4x4 Tastatur muss ja nicht mit Höchstgeschwindigkeit abgefragt werden.
Die Tastatur über einen I2C-IO-Expander wie zum Beispiel den MCP23017 anschließen

Da gibt es libraries die man quasi als "drop-in-replacement" benutzen kann.

Ich habe das eben mal mit einem MCP23017 und diesem auf 4x4-Tastatur angepasstem Demo-Code getestet

/* file CustomKeypad_MC17 Feb 2/13
||@file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
    Use with I2C i/o G. D. (Joe) Young Feb 28/12

    Use with MCP23008 I2C i/o G. D. (Joe) Young Jul 29/12
    Use with MCP23016 I2C i/o G. D. (Joe) Young Feb 2/13
    Use with MCP23017 I2C i/o G. D. (Joe) Young May 19/14
*/
#include <Keypad_MC17.h>
#include <Keypad.h>        // GDY120705
#include <Wire.h>

#define I2CADDR 0x27

const byte ROWS = 4; //four rows
const byte COLS = 4; //five columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

// PORT A is pin-numbers 0 to 7
// PORT B is pin-numbers 8 to 15
byte rowPins[4] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[4] = {4, 5, 6, 7}; //connect to the column pinouts of the keypad


//initialize an instance of class NewKeypad
Keypad_MC17 customKeypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR); 

void setup(){
  Wire.begin();
  customKeypad.begin();        // GDY120705
  Serial.begin(115200);
  Serial.println("press a key to see the value in the serial monitor");
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey != NO_KEY){
    Serial.println(customKey);
  }
}

je nach 4x4 Keypad muss man die Reihenfolge der IO-pins

byte rowPins[4] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[4] = {4, 5, 6, 7}; //connect to the column pinouts of the keypad

eventuell anpassen. Oder die Anschlussreihenfolge.

Dann haste wieder 8 direkte IO-Pins frei

vgs

Wenn du ohnehin schon I2C verwendest dann lies deine Buttons auch mit I2C aus.
Ich würde dazu aber keinen normalen Portexpander nehmen, sondern einen, der schon Tastatur-Matrixen selber auslesen kann. Da ersparst du dem Prozessor das permanente Umschalten/abfragen sondern brauchst nur mehr abfragen welcher Taster gedrückt wurde.

Z.B. ein SX1509
Library und Muster Sketche: https://learn.sparkfun.com/tutorials/sx1509-io-expander-breakout-hookup-guide

Der SX1509 ist ohnehin ein interessanter IC, auch z.B. wenn man weitere Ports / LEDs / PWM etc braucht. Kann man sich schon mal ansehen.

@noiasca

Ich habe den Tastatur-Sketch getestet:
I2C-Scanner findet Adresse 0x3E

12:42:23.267 -> Scanning...
12:42:23.267 -> I2C device found at address 0x3E  !
12:42:23.267 -> done

Aber wenn ich den Sketch Tastatur-Demo von der Sparkfun-Seite flashe meldet das Programm

12:42:35.316 -> Failed to communicate.

Achja wieder mal so ein Tutorial bei dem erst mal fast nichts klappt.
Da ist mir der MCP23017 der auf Anhieb funktioniert doch lieber.

Trotzdem jetzt interessiert es mich woran es liegt dass es mit dem SX1509 noch nicht klappt.

Sparkfun schreibt der SX1509 wird mit 3.3V betrieben ist aber 5V tolerant.
Heisst das da muss jetzt doch ein Levelshifter 3.3V/5V dazwischen?
vgs

tja und was soll ich von einem Tutorial halten das sich im LED-Blink-Demo zu fein ist
die serielle Schnittstelle zu öffnen um eine Rückmeldung zu geben ?

So Leute würde ich gerne zwingen, dass sie ihr Tutorial auf Papier gedruckt aufessen müssen!

vgs

Das heisst z.B. einen Blick in das DaBla tun.

Sehr gute Idee, Danke.

Sparkfun schreibt:

  • Logic Levels -- While most Arduino's operate at 5V, the SX1509 works at 3.3V. The GPIO are, at least, 5V tolerant!

Also brauchst du keine Level-Shifter auf den I2C Leitungen.

Dein Problem mit dem LED-Blink-Demo kann ich noch nicht nachvollziehen.
Auf der Homepage wird im Blink kein Serielle Schnittstelle verwendet - vielleicht damit es ganz einfach bleibt.

Im Download der Lib wird im Blink Beispiel die Serielle Schnittstelle geöffnet und eine Fehlermeldung ausgegeben.

Wenn du weitere Probleme mit der Anwendung des SX1509 und der Sparkfun Lib hast, empfehle ich dir, deinen eigenen Thread dazu aufzumachen.

So ich habe jetzt den SX1509 ans laufen bekommen.
Im Demo-code für das Keypad bzw. das LED-blink der auf der Internetseite steht
fehlt das Wire.begin()

Ich liiiebe es wenn Demo-Codes solche Korrekturmöglichkeiten bieten!

Jetzt wäre schön wenn das Interrupt Beispiel nicht einen "Hauptinterrupt" verbraten würde sondern einen pin-change interrupt benutzen würde. Ok zu offtopic. Ich mach einen eigenen Thread dazu auf.
vgs

OT: lol ... sie habe ein wirklich gutes Tutorial zum Library schreiben. Da erklären sie warum man kein Wire.begin() in einer Lib machen soll sondern im Usersketch. Dass sie das dann auf der HP auch vergessen ist gaga. Keine Frage :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.