Freitag, 5. April 2013

LCD Shield für den Arduino Uno - ein erster Ätzversuch

Nachdem mein Ätzgerät betriebsbereit war, stand ein erster Ätztest an. Um nicht gleich zu viel Ausschuss zu produzieren, habe ich ein LCD Shield für den Arduino Uno entworfen, das ich für die Programmtests meines Step Sequencer Projektes benutzen kann.

Entsprechend dem Instruction Panel beim Step Sequencer 
Enwurf, enthält das LCD Shield neben einem 2x16 Zeichen LCD (Hitachi HD44780 kompatibel), 6 Taster und einen Encoder inkl. Taster für die Menü-Navigation und zur Dateneingabe.

Hier der Schaltplan und das Platinen Layout entworfen mit Eagle von CadSoft:






Die entsprechenden Dateien sind hier als Download zu finden:

http://hardsoldered.de/downloads.html

Die Ätzmaske habe ich per Tonertransfer-Verfahren auf kupferkaschiertes Epoxyd-Platinenmaterial übertragen. 
Eine Anleitung dazu habe bei Thomas Pfeifer gefunden und Versuche mit unterschiedlichen Papiersorten und "Bügelzeiten" durchgeführt. Nach 3 Versuchen kam ein brauchbares Ergebnis - zwar mit deutlichem Optimierungspotential - zustande und wurde sogleich geätzt:


Die Platine zeigt deutlich, dass der Toner nicht gleichmäßig haftete und nicht gleichmäßig verdichtet wurde. Aber die Leiterbahnen waren alle durchgängig und ohne Kurzschluss, ebenso die Pads. Also stand der weiteren Bearbeitung nichts im Wege.

Nach dem endgültigen Zuschnitt der Platine folgte das Bohren mit 0,8 mm und 1 mm Bohrern und anschließend das Bestücken:





Die Rückseite sieht etwas unkonventionell durch die Verkabelung des Encoders aus.







Danach folgten die ersten Tests. Hier natürlich der übliche "Hello World"-Test für die LCD Anzeige: Arduino LCD Tutorial



Im Anschluss habe ich den Code angepasst, um auch den Encoder und die Taster abzufragen und die Aktionen auf dem Display anzuzeigen. 



Und hier nun das Ergebnis:





Code:
/* LCD Shield Test Routine V 0.1 Chris 130405                                   
 The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
* Encoder push switch at digital pin 8
* Encoder A/B at digital pins 9, 10
* Button 1..6 at analog pin 0..5
*/

// include the library code:
#include <LiquidCrystal.h>
#include <Encoder.h>

// initialize the libraries:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Encoder myEnc(9, 10);

// initialize the button pins:
int buttonPin[] = {8, A5, A4, A3, A2, A1, A0};

// initialize values:
int val[] = {1,1,1,1,1,1,1};
int banz = 7;
int resetButton = 0;

void setup() {
// set pinModes for button pins:

  for( int i=0; i<banz; i++) {
    pinMode( buttonPin[i], INPUT );
    digitalWrite( buttonPin[i], HIGH);
  }
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Test:");
}

long oldPosition  = -999;

void loop() {
  // Encoder test routine:
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    lcd.home();
    lcd.print("Encoder Test:   ");
    oldPosition = newPosition;
    lcd.setCursor(0, 1);
    lcd.print("          ");    
    lcd.setCursor(0, 1);
    lcd.print(newPosition);
  }

  // button test routine:
  for( int i=0; i<banz; i++) {
    int newval = digitalRead( buttonPin[i] );
    if( newval != val[i] ){
      val[i] = newval;
      lcd.home();
      lcd.print("Button Test:    ");
      lcd.setCursor(0, 1);
      lcd.print("          ");    
      lcd.setCursor( 0, 1 );
      if( val[i] != 1 ){
        lcd.print(i);
        // reset encoder value with encoder button
        if( i == resetButton ){
          myEnc.write(0);
        }
      }
    }
  }
}




Ätzen gut - alles gut.