Sonntag, 28. April 2013

MIDI Shield für den Arduino

Nach dem LCD Shield folgt nun ein MIDI Shield, um das Programmieren und Testen für das Step Sequencer Projekt zu vereinfachen.

Die Anforderungen:
- MIDI In
- MIDI Out
- Programmierschalter (trennt MIDI vom seriellen Port)
- LED zur Anzeige der Funktion
- zwischen Arduino Uno (oder Mega) und LCD Shield platzierbar

Das MIDI In Signal wird galvanisch per Optokoppler vom Controller getrennt. Der Schmitt Trigger im Ausgangspfad dient der Stabilisierung des Ausgangssignals. Die LED habe ich eingebaut, da die LED am Arduinoboard, die an Pin 13 angeschaltet ist, durch die Shields überdeckt wird und nur schwer eingesehen werden kann.
 
Hier der Schaltplan und das Platinen Layout, entworfen mit Eagle von CadSoft:





 Die Bauteile:



R1, R2, R3, R4 Widerstand 220 Ω
R5 Widerstand 1,6 kΩ
R6 Widerstand 10 kΩ
C1 Keramikkondensator 100 nF
D1 Diode 1N4148
LD1 LED L-934LID, low current, 2 mA, rot
IC1 74HCT14N hex inverting Schmitt trigger
OK1 6N138 Optokoppler
S1 2-poliger Umschalter
X1, X2 MAB5SH Diodenbuchse, 5-polig, halbrund
sonstiges: 2x 6-polige Stecker-/Buchsenleiste (Arduino Stackable Header)
2x 8-polige Stecker-/Buchsenleiste (Arduino Stackable Header)
Platine

Die Platine:

Die entsprechenden Eagle-Dateien können hier heruntergeladen werden:

http://hardsoldered.de/downloads.html

Die Ätzmaske der Platine habe ich wieder im Tonertransferverfahren aufgebracht. Diesmal jedoch nicht mit einem Bügeleisen, sondern mit einem Laminator. Ich habe mir einen PAVO HD-220-PRO zugelegt, der für diese Anwendung mit 160 °C ausreichend heiß wird und nicht umgebaut werden muss.


Das Ätzen erfolgte wieder im selbstgebauten Ätzgerät:


... und führte zu einem brauchbaren Ergebnis:


Es folgte das Bohren und anschließend das Bestücken.


Hier im Verbund mit dem LCD Shield


Der Code für den ersten Funktionstest liefert eine aufsteigende Tonfolge an einem MIDI fähigen Gerät (bei mir Roland Juno GI):


/*
  midi test by chris 130415

*/

// include libraries:
#include <LiquidCrystal.h>
#include <Encoder.h>

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

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

// initialize values:
int val[] = {1,1,1,1,1,1,1};
int banz = 7;
int resetButton = 0;
char blockChar = 255;
const int numRows = 2;
const int numCols = 16;


void setup() {
  for( int i=0; i<banz; i++) {
    pinMode( buttonPin[i], INPUT );
    digitalWrite( buttonPin[i], HIGH);
  }
  lcd.begin(numCols, numRows);
  Serial.begin(31250);
  pinMode(led, OUTPUT);    
  lcd.clear();
  lcd.home();
  lcd.print("MIDI Note:    ");
}

void loop() {
  for (int note = 0x1E; note < 0x5A; note ++) {
    noteOn(0x90, note, 0x45);
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print(note);
    digitalWrite(led, HIGH);  
    delay(250);
    noteOn(0x90, note, 0x00);  
    digitalWrite(led, LOW);   
    delay(250);
  }
}

void noteOn(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

Sonntag, 21. April 2013

Innenansichten: Mobilteil Cocoon 950

Was steckt eigentlich in einem Mobilteil eines schnurlosen Telefons?

UCOM Cocoon 950 von Topcom (Belgien)


Hier die Merkmale des Gerätes (aus der Bedienungsanleitung entnommen):
  • DECT ( Digital Enhanced Cordless Telecommunications ) und GAP ( Generic Access Profile )
  • 1880 MHz bis 1900 MHz
  • 120 Duplexkanäle
  • Modulation: GFSK
  • Codiergeschwindigkeit: 32 kbit/s
  • Emissionsleistung: 10 mW (durchschnittliche Leistung pro Kanal)
  • Reichweite: 300 m im freien Gelände, 50 m maximal im Gebäude

Das Öffnen scheint auf den ersten Blick einfach zu sein. Zwischen den Ladekontakten befindet sich ein Schnappverschluss. Doch auch nach umseitigen und umsichtigen hebeln am Gehäuse, ließ es sich nicht öffnen.



Die Lösung: unter einem Bar-Code Aufkleber im Akku-Fach befinden sich 2 Kreuzschlitzschrauben, die entfernt werden müssen.




  




Linker Hand befindet sich der Lautsprecher für das Freisprechen und die Klingeltonsignallisierung. Die Platine ist mit 2 weiteren Schrauben am Gehäuse fixiert.
Auf der Rückseite befindet sich das übliche Tastenfeld und das Display, sowie ein Miniaturlautsprecher fürs Ohr und die Mikrofonkapsel.





Die Beschriftung der Platine gibt 2 Datumsangaben preis: 23.9.2004 und 30.7.2004. Beides vermutlich Daten einzelner Produktionsschritte.




 

Interessant erscheint mir die Antennenkonstruktion, bestehend aus einer einseitig abgerundeten Metallplatte mit Massepotential, darüber einen abgerundeten Metallbügel und seitlich rechts noch ein gerader Metallbügel.
 




In der Nähe des Lautsprecheranschlusses befindet sich ein IC mit der Beschriftung 34119E. Dabei handelt es sich um einen Low Power Audio Amplifier speziell für Telefonanwendungen. Er liefert bis zu 250 mW an 32 Ohm, kann mit Spannungen von 
2 V - 16 V betrieben werden und besitzt Stromsparfunktionen.


Philips G820H09, TFQP80 Gehäuse: kein Datenblat, keine Funtionsbeschreibung ... nichts zu finden. Vermutlich ein kundenspezifisch gefertigter Chip, mit den Ausmaßen und Funktionen eines Controllers.


Der SST 37VF010 ist ein Flash Speicher Chip mit 1 MBit Kapazität.


Darunter ein HC373 (8 bit D-Type Latch mit 3-State Output) als Portexpander für die Anbindung der Tastatur via Multiplexing.  
Rechts vom SST 37VF010 sieht man den Grund, warum dieses Mobilteil nicht mehr richtig funktioniert: eine defekte Zenerdiode. Sie wird zur Regelung der Ladespannung für die Akkus benötigt, da das Netzteil der Basisstation  
9 V liefert, die Akkus aber nur 2,4 V benötigen.



 Für ein Gerät vom Discounter wird ein hoher Schrauben pro Kubikzentimeter Quotient erreicht ;-)

Sonntag, 14. April 2013

Programmieren eines Arduino Mini Pro

Der Arduino Mini Pro von Sparkfun:
- Spannung 5 V
- Takt 16 MHz 
- Abmessung 18 x 33 mm
- Gewicht < 2g





Zur Programmierung besitzt der Mini Pro nur ein UART TTL Serial Communication Interface. Eine Wandlung auf USB muss also extern erfolgen. 
Ich nutzte dafür einen mySmartUSB MK2 USB-Programmer, den ich noch von einem früheren Projekt habe. Dieser Programmer lässt sich auch als reine UART-Bridge einsetzen und wird wie folgt angeschlossen:



Wenn man den Betriebsmodus nicht über ein Programm ändern möchte, kann man ihn an einem DIP-Schalter fest auf den UART- Bridge Modus einstellen.
Treiber und Programme findet man bei myAVR.





In der Arduino IDE ist noch das richtige Board einzustellen:



Beim Upload ist darauf zu achten, dass der Pro Mini in dieser Beschaltung kein automatisches Reset durchführen kann. Wenn im Statusfenster der Arduino IDE nach Starten des Uploads die Meldung "Binary sketch size... " erscheint, muss man kurz den Reset-Taster des Pro Mini betätigen, damit der Upload ohne Fehler beendet werden kann.
Zum Test kann man einfach den "Blink"-Sketch einspielen, der die grüne LED unterhalb des Reset-Tasters zum Blinken bringt:



Wichtig: wer schon mal nach einer SD-Karte suchen musste, sollte auf dieses Kerlchen besonders aufpassen. Der Pro Mini könnte sich unter der SD-Karte verstecken.


Samstag, 13. April 2013

Innenansichten: Sat-Receiver Smart Rapido II




Werfen wir einen Blick in einen frühen Vertreter der Digital-Receiver - sprich: ohne HDTV.


Smart Rapido II 


ASTRA, PAL, 30W, made in ??? (Fernost)



Die Beschriftung der rechten Scart-Buchse gibt einen weiteren Hinweis, aus welcher Epoche der Fernsehtechnik diese kleinod stammt: VCR = Video Cassette Recording ;-)


Die 3 Gehäuseschrauben sind schnell gelöst, das Öffnen des Gehäuse offenbart einen großzügig bemessenen Innenraum:



40% Receiver-Platine, 20% Netzteil. Warum so ein großes Netzteil? Das verrät ein Blick auf die Vielzahl der Versorgungsspannungen, die die Receiver-Platine benötigt. Auf der Unterseite der Platine befinden sich keine Bauteile.













Was hat die Receiver-Platine zu bieten?

Als erstes sticht ein IS42S16400B ins Auge. Ein SDRAM Speicherchip mit 64 MBit und einer Taktrate bis 166 MHz. Dies ist vermutlich der erweiterte Arbeitspeicher des Controllers.
Und weil ich gerade beim Speicher bin: der MX29LV160 ist ein 16 MBit CMOS Flash-Speicher. Hier dürften die Konfigurationsdaten (Einstellungen, Senderlisten, Favoriten, ...) für den Controller gespeichert sein.




Apropos Controller - wo steckt der eigentlich? 

Der versteckt sich unter einem Kühlkörper,  der mit sanfter Gewalt und Hebelkraft entfernt werden muss.
Zum Vorschein kommt ein STI5518, ein "SINGLE-CHIP SET-TOP BOX DECODER WITH MP3 AND HARD DISK DRIVE SUPPORT". 

Leider wurde der Hard Disk Support nicht genutzt und keine Disk verbaut - schade.

Ob man da was basteln kann? ;-)



Getaktet wird STI5518 mit 27 MHZ, obwohl die 32-bit CPU auch 81 MHz abkönnte. Er kann 5.1 Dolby Digital und auch DTS. 
Jedoch auch hier gilt: von Gerät nicht genutzt.





Ebenfalls auf der Platine: ein CD4053M - 3x2 Multiplexer Kanäle - analog-digital






und ein Operationsverstärker LM358.
Und dann gibt es noch einen PT8211 Digital-Analog Wandler mit 16-Bit Auflösung. Notwendig, da der Receiver Audio auch in analoger Form liefert.




Im Tunerbaustein von Sharp ist ein STV0299B verbaut, der für die QPSK/BPSK Demodulierung sorgt. Der Baustein kann via I2C Interface von einem Controller gesteuert werden.







Ein LM317 Spannungsregler ist ebenfalls vorhanden. Nicht sehr spektakulär, aber von 1,25 V bis 37 V regelbar, bei bis zu 1,5 A Stromstärke. Der wandert in jedem Fall in die Bastelkiste.




Zu den Bedienelementen:



- 7 Taster zur Kanalwahl und Menüe-Steuerung
- eine IR-Diode zum Empfang der Fernbedienungssignale
- 2 LEDs zur Statusanzeige
- ein 4-stelliges 7-Segment LED Display zur Kanalanzeige



Auf der Rückseite befindet sich ein 74HC164, ein 8-bit serial-in, parallel-out shift register. Die übliche Anwendung in diesem Umfeld ist das Multiplexen der LED Anzeige.




Riskieren wir noch eine Seitenansicht auf die LED Anzeige:





Damit hat sich das Gerät das Prädikat:

verdient.


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.