Midi Controller + AD 5204

Hallo zusammen,

ich würde gerne meinen DIY Midicontroller um ein Digitalpoti AD 5204 erweitern um damit eine analoge Klangregelung steuern zu können.
Zur Verwendung kommt dabei ein Arduino Uno.

Der funktionierende Sketch (noch ohne AD 5204) sieht zZ so aus:

#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);


int MidiKanal = 1 ;//  Midikanal 1
int controllerNummer = 21; //Ctrl
int controllerWert = 0;// CC
int controllerWertAlt = 0;
int potiWert = 0;

void setup() {
Serial.begin(9600);

// initialize the LCD
lcd.begin();

// Turn on the blacklight and print a message.
lcd.backlight();
lcd.print("MidiController");

}

void loop() {
  //potiWert = analogRead(A2);
  //MidiKanal = map(potiWert, 0,1023, 1,16); // 
 //potiWert = analogRead(A1);
 //controllerNummer = map(potiWert, 0,1023, 0,127);//Controller Nummer
  potiWert = analogRead(A0);
  controllerWert = map(potiWert, 0,1023, 0,127);//Midi CC


  if (controllerWert != controllerWertAlt) {
    Serial.write(MidiKanal) ;
    Serial.write(controllerNummer);
    Serial.write(controllerWert);

  if (controllerWert != controllerWertAlt)
    lcd.setCursor(0, 0);
    lcd.print("Midi Kanal   ");
    ausgabe(MidiKanal);

    lcd.setCursor(0, 1);
    lcd.print("Ctrl ");
    ausgabe(controllerNummer);

    lcd.setCursor(8, 1);
    lcd.print(" |""cc ");
    ausgabe(controllerWert);

}
controllerWertAlt = controllerWert;
}

void ausgabe (int wert) {
if (wert < 100) lcd.print(00);
if (wert < 10) lcd.print(0);
lcd.print(wert);
}

Testweise habe ich für den AD 5204 mal diesen Sketch versucht zu integrieren und die Schaltung so aufgebaut und auch mehrfach kontrolliert.

Beim kombinieren beider Sketche werden mir Fehler in Zeile 54 angezeigt => ‘setPot’ was not declared in this scope… <=
Kompilieren ist damit leider nicht möglich (weder mit IDE 1.86 noch mit 1.90).
Ich komme aber auch nicht dahinter wo genau der Fehler liegt…

Vielleicht kann ja mal jemand von Euch da einen Blick drauf werfen ?

Hier mal die Kombination beider Sketches:

#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>    // SPI Library für AD 5204

const int CS = 10;    // Chip Select For the AD5204


// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);


int MidiKanal = 1 ;// Midikanal 1
int controllerNummer = 21;//Ctrl
int controllerWert = 0;// CC
int controllerWertAlt = 0;
int potiWert = 0;


void setup() {
Serial.begin(9600);

// initialize the LCD
lcd.begin();

// Turn on the blacklight and print a message.
lcd.backlight();
lcd.print("MidiController");

pinMode(CS, OUTPUT);
digitalWrite(CS, HIGH);
SPI.begin(); // start SPI bus.
SPI.setBitOrder(MSBFIRST);
}

void loop()
{
//potiWert = analogRead(A2);
//MidiKanal = map(potiWert, 0,1023, 1,16); // Midikanal
//potiWert = analogRead(A1);
//controllerNummer = map(potiWert, 0,1023, 0,127);//Controller Nummer

potiWert = analogRead(A0);
controllerWert = map(potiWert, 0, 1023, 0, 127);


//Set resistance from 0% to 100% in all output
  for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 255; j++) {
  setPot(i,j);
  delay(100);
  }
  
  {
    if (controllerWert != controllerWertAlt) {
      Serial.write(MidiKanal);
      Serial.write(controllerNummer);
      Serial.write(controllerWert);
    }
    controllerWertAlt = controllerWert;
    }

void ausgabe (int wert) {
if (wert < 100) lcd.print(00);
if (wert < 10) lcd.print(0);
lcd.print(wert);
    }

  //----[Functions]--------------------

  // POT value: 0 -> 3
  // LEVEL value: 0 -> 254 (8 bits)

  void setPot(int POT, int LEVEL) {
    digitalWrite(CS, LOW);
    SPI.transfer(POT);
    SPI.transfer(LEVEL);
    digitalWrite(CS, HIGH);
    }

würde mich freuen wenn Ihr mir weiterhelfen könntet !
Grüße

stingray05:
würde mich freuen wenn Ihr mir weiterhelfen könntet !

Zunächst könntest Du Dein Posting lesefreundlicher machen, indem Du den Code in Code-Tags fasst. Du kannst das auch nachträglich tun.

Gruß

Gregor

Testweise habe ich für den AD 5204 mal diesen Sketch versucht zu integrieren und die Schaltung so aufgebaut und auch mehrfach kontrolliert.

Und, hat das funktioniert?

Klaus_ww:
Und, hat das funktioniert?

Nein, hat auch nicht funktioniert wenn ich den Beispielcode vom AD 5204 1:1 verwende Es kommen aber dabei auch keine Fehlermeldungen. Kompilieren funktioniert.

Angeschlossen ist der AD 5204 folgendermaßen:

PIN 3 (GND) vom AD 5204 geht auf Arduino GND
PIN 6 (VDO 5V) vom AD 5204 geht auf Arduino 5 V
PIN 8 (SDI) vom AD 5204 geht auf Arduino PIN 11
PIN 9 (CLK) vom AD 5204 geht auf Arduino PIN 13
PIN 10 (SDO) vom AD 5204 geht auf Arduino PIN 12

Glaube ich hab hier noch nen Grundsätzlichen Denkfehler drin und fange deshalb nochmal ganz von vorne, - ohne LCD / ohne Midi an...

Also 1 x Analoges Poti per Arduino auslesen und damit AD 5204 ansteuern.
Wenn ich das richtig verstanden habe erwartet der AD 5204 an seinem Eingang Digitalsignale in Form von SDI, CLK und SDO.

Wie müsste dafür der Sketch aussehen ?

Mir fehlt PIN 4 (CS) -> Pin 10

stimmt !
Danke für den Hinweis - funktioniert so leider trotzdem nicht…

weitere Ideen ?

Wenn ich den AD 5204 Sketch richtig verstehe, müsste dazu der Arduino die Werte des an A0 angeschlossenen analog Potis “nur” per digitalWrite an PIN 10 ausgeben ( CS = PIN 4 vom AD 5204) ?

Ist vielleicht noch ein zusätzlicher Schritt zur AD 5204 Programmierung nötig ?

Hab hier mal ein Test Sketch mit nur einem analogen Poti zur Ansteuerung des AD 5204 gebastelt.
Läst sich ohne Fehler kompilieren:

/*
  AD5204 - Arduino Example
  www.danielandrade.net - daniel spillere andrade
  https://github.com/dansku/ad5204
  June 2014  
*/

#include "SPI.h"    // SPI Library

int sensorPin = A0;    // select the input pin for the potentiometer
int sensorValue = 0;  // variable to store the value coming from the sensor
const int CS = 10;    // Chip Select For the AD5204

//----[Setup]------------------------

void setup()
{
  pinMode(CS,OUTPUT);
  digitalWrite(CS,HIGH);
  SPI.begin(); // start SPI bus. 
  SPI.setBitOrder(MSBFIRST); 
}

//----[Loop]--------------------------

void loop()
{

  // read the value from the sensor:
  sensorValue = analogRead(sensorPin)
  
  //Set resistance from 0% to 100% in all output
 ;for(int i=0;i<4;i++){
    for(int j=0;j<255;j++){
      setPot(i,j);
      delay(100);
    }
  }
}

//----[Functions]--------------------

// POT value: 0 -> 3
// LEVEL valeu: 0 -> 254 (8 bits)

void setPot(int POT, int LEVEL){ 
  digitalWrite(CS, LOW);
  SPI.transfer(POT);
  SPI.transfer(LEVEL);
  digitalWrite(CS, HIGH);
}

Am AD 5204 lassen sich mit angeschlossenem Multimeter aber an keinem Ausgang Widerstandsänderungen erkennen…

Vielleicht kann sich das nochmal jemand ansehen ?

Gruß

test_AD5204.ino (1.13 KB)

AD5204_5206.pdf (302 KB)

Du wurdest bereits gebeten, Deinen Sketch in Codetags zu setzen. Warum tust Du das nicht?

Gruß Tommy

Hallo Tommy,

danke für den Hinweis !

hätte ich schon längst gemacht wenn ich wüsste wie !
Gibts dafür irgendwo ne Anleitung ?

Gruß

Ja, hier.

oder </>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *.

Gruß Tommy

Hallo Tommy,

hab gerade die Code Tags eingefügt - vielen Dank für die schnelle Info. Hoffe das Dass jetzt so wie gewünscht ist.
Sorry falls ich dadurch gegen die Board Netiquette versstoßen haben sollte…-

Habe den Original AD 5204 Sketch lediglich um ein Analog Poti an Pin A0 mit Ausgabe per digitalWrite an PIN 10 ( CS = PIN 4 vom AD 5204) erweitert (keine Fehler beim compilieren)…

Am AD 5204 lassen sich am Ausgang nach wie vor keine Widerstandsänderungen messen…

Da keine Fehler angezeigt werden ist es schwierig die Fehlfunktion überhaupt mal in Richtung Hardware oder Software einzugrenzen…

Könnte sich deshalb nochmal jemand den nachstehenden Sketch ansehen ? - Komme so leider nicht weiter… !

Gruß

/*
  AD5204 - Arduino Example
  www.danielandrade.net - daniel spillere andrade
  https://github.com/dansku/ad5204
  June 2014  
*/

#include "SPI.h"    // SPI Library

int anlogPotiPin = A0; // select the input pin for the potentiometer
int sensorWert = 0;    // variable to store the value coming from the sensor  

const int CS = 10;     // Chip Select For the AD5204 (PIN 4 => Arduino PIN 10)


//----[Setup]------------------------


void setup()
{
  Serial.begin(9600);
  
  pinMode(CS,OUTPUT);
  digitalWrite(CS,HIGH);
  SPI.begin(); // start SPI bus. 
  SPI.setBitOrder(MSBFIRST); 
}

//----[Loop]--------------------------

void loop()
{

   // read the value from Anaog Poti A0:
      sensorWert = analogRead(anlogPotiPin); 

   //Set resistance from 0% to 100% in all output
     for(int i=0;i<4;i++){
     for(int j=0;j<255;j++){
     setPot(i,j);
     delay(100);
}
    }
  }


//----[Functions]--------------------


// POT value: 0 -> 3
// LEVEL valeu: 0 -> 254 (8 bits)

void setPot(int POT, int LEVEL){ 

  digitalWrite(CS, LOW);
  SPI.transfer(POT);
  SPI.transfer(LEVEL);
  digitalWrite(CS, HIGH);
}