Dieses Blog durchsuchen

Arduino mit Matlab ... Der Sensor

Nachdem ich im letzten Teil die Installation der Arduino-Matlab Packages zum Laufen bekommen habe, kann es nun weitergehen. Ziel dieses kleinen Beispiels ist es ja, an einen Arduino Uno einen NTC-Widerstand anzuschliessen. Dieser soll als analoger Temperatursensor dienen (was er ja ist :D ) und über einen der A/D - Eingänge des Arduino eingelesen werden. Matlab soll dann schlussendlich die eingelesenen A/D- Werte  in Temperaturwerte umrechnen. Das ganze soll über eine gewisse Zeit laufen, wobei alle paar n-Sekunden ein Wert eingelesen wird. Am Ende soll ein wunderschöner Temperaturplot mit Temperatur über Zeit erstellt werden.

Doch zuerst zum Sensor. Ich verwende hier einen NTC-Widerstand von dem Hersteller VISHAY mit einem R25 von 2200 Ohm (s.Datenblatt). Das bedeutet, er hat bei 25°C einen ohmschen Widerstand von 2.2kOhm. Je wärmer es nun wird, umso kleiner wird der Widerstand und umgekehrt. Der analoge Eingang des Arduino hat eine Auflösung von 10Bit. Das bedeutet, er kann den Spannungshub am Eingang (eingestellt durch die ADC Referenz) in 210 , also 1024 Teile auflösen (zerlegen). Der Standart beim Arduino ist 0V bis 5V. Also 0V am Eingang bedeutet einen ADC-Wert von 0 und 5V bedeutet einen ADC-Wert von 1024. Die Auflösung, also die kleinste auflösbare Spannungsänderung  ist daher:
Gibt der ADC beispielsweise einen Wert von 558 aus, so enstspricht dies einer Spannung am Eingang von 558*0.00488V = 2.72304V. Doch wie soll der NTC jetzt an den Eingang angeschlossen werden? Ganz einfach. Man nehme einen Spannungteiler und dimensioniere ihn so, dass der Strom durch die beiden Widerstände nie so groß werden kann, dass er zum einen die Versorgung des Arduino gefährdet und zum anderen auch nie so groß werden kann, dass er den NTC selbst erwärmt. In der Skizze ist nun dargestellt wie der Spannungsteiler aufgebaut und angeschlossen ist. Jetzt gilt es noch herauszufinden, wie aus der Spannung am ADC der gemessene Widerstandswert berechnet werden kann. Hier hilft die Spannungsteilerregel:

In diesem Beispiel hier besteht der Spannungsteiler aus dem NTC (2k2 @ 25°C) und einem 2k2 Festwiderstand. Wenn der NTC null Ohm haben sollte (nur rein theoretisch), so fließt ein maximaler Strom von 0.002A durch die Widerstände (5V/2200Ohm). Wir lesen jetzt in Matlab den Spannungsabfall am NTC ein und können uns über den Spannunsteiler den Widerstandswert berechnen. Jetzt fehlt nur noch die Formel zur Berechnung der Temperatur. Und die ist, samt den notwendigen Konstanten A1, B1, C1 und D1, im Datenblatt angegeben:

Das Ergebnis dieser Berechnung ist die Temperatur in Kelvin. Um die Temperatur aber in °Celsius angezeigt zu bekommen, rechnet man: °C = °K-273,15. Mit all diesen Informationen kann man jetzt ein Matlab-Script schreiben, das dann in etwa so aussieht:
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 % Beispielscript um mit ArduinoUno einen Temperaturverlauf aufzuzeichnen  
 % 02/2016 by I.Bihlo  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 %a = arduino('com5','Uno');  
  a = arduino('com5','Uno','TraceOn', true)  
  analogpin=0;  
  analog=0;  
  %ein paar konstanten für die weiteren berechnungen  
  %  
  r=2200; %Spannungsteilerwiderstand  
  rt=0; %das wird der errechnete widerstand des NTC  
  urt=0; %das wird der errechnete Spannungsabfall am NTC  
  % konstanten für berechnung der Temperatur aus NTC Widerstand  
  % B25=3977K  
  a1=3.354016E-03;  
  b1=3.2569850E-04;  
  c1=2.61013E-06;  
  d1=6.38309e-08;  
  rref=2200;  
  %Lesen eines Temperaturabhängigen Widerstandes am Analog Eingang A0  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  for x=1:50  
  analog(x)=readVoltage(a, analogpin) %Liest den AnalogIn von A0 und gibt in Volt aus  
  urt(x)=5-analog(x); %spannungsabfall am NTC  
  rt(x)=(r/analog(x))*urt(x); %widerstand des NTC  
  %berechung der temperatur  
  rvsrref(x)=rt(x)/rref;  
  temp(x)=1/(a1+(b1*log(rvsrref(x)))+(c1*(log(rvsrref(x)^2)))+(d1*(log(rvsrref(x)^3))));  
  tempc(x)=temp(x)-273.15 %Kelin in Celsius umrechnen  
  pause(2);  
  end  
  clear a;  
  %plot den mist  
  figure(1);  
  time=1:50;  
  plot(time,analog,'b');  
  grid on; hold on;  
  plot(time,rt/1000,'r');  
  plot(time,urt,'g');  
  plot(time,tempc,'m');  
  legend('Analogspannung des ADC','Widerstand des NTC in kOhm','Spannung am NTC','Temperatur [°C]'); %ende  

Ärger mit HDMI Upscaler

Dieses Teil hier habe ich mir über ebay bestellt. Es ist dies ein Video - "Upscaler", also ein Teil, das den alten analogen Videostandard (Composite CVBS) digitalisiert und in den HD-Standard 720p bzw. 1080p hochrechnet und über eine HDMI Buchse ausgibt. Gedacht ist es, um den Output eines alten VHS-Recorders, einer alten Spielekonsole oder des guten alten Commodore C64 auf den Fernseher, oder eher auf einen Computermonitor zu bekommen, der einen digitalen Eingang (DVI) hat. So also der Plan. Also im Netz gesucht und unter vielen Angeboten ein Gerät gefunden, das neben den Chinch Buchsen für CVBS-Video und Audio L,R auch noch einen HDMI Eingang besitzt. Cool - dachte ich. Mit drei Tasten soll man Auflösung, 50/60Hz (Pal/NTSC-TV Norm) und eben den Eingang umschalten können.

 Also bestellt, bezahlt und auch geliefert bekommen. Und gleich einen ersten Test, wie denn die Bildqualität am PC-Monitor so sei, begonnen. Also das Gerät (in einer Mattschwarzen Metallbox - optisch gut verarbeitet) angeschlossen, das mitgelieferte 5V Steckernetzteil eingestöpselt und in freudiger Erwartung auf den Bildschim gestarrt. Da stand aber ausser "kein Signal" nur mehr ... eben "kein Signal".
Also erstmal überprüft, ob Saft da ist. Ja - die rote Led am Gerät leuchtete. Dann die Kabelverbindungen überprüft, andere Kabel bzw. Adapter verwendet - nichts. Danach versucht, vom Raspi über HDMI an die Box, dann weiter über HDMI an den TV ... nichts. Dann alle möglichen Tasten und Kombinationen gedrückt ... wieder nichts. Als Endkontrolle dann den Raspi direkt mit dem TV über HDMI verbunden - und bumm - Bild ist da. Also muß was mit dem Converter nicht stimmen. Kein Problem dachte ich, reklamieren und zurücksenden. Genau das habe ich nach Absprache mit dem Lieferanten auch gemacht. Dann passierte erstmal nicht. Keine Rückerstattung, kein neues Gerät. Die Zeit verging ... knapp sechs Wochen später kam dann der Paketdienst - aber er brachte keinen neuen Converter, sondern mein Paket wieder zurück. Mit dem Postvermerk "wurde nicht abgeholt". Also wieder den Lieferanten kontaktiert... er habe nichts erhalten, auch keinen Abholschein, bekam ich zu hören. Ich solle das Paket einfach noch einmal versenden. Die Kosten für den Rückversand trage er aber nicht. (wieder nicht). Das war jetzt genug. Das Hin- und Hersenden übersteigt ja schon fast den Warenwert. Da von diesem Händler kein kulantes Verhalten zurückkam, kam von mir eine negative ebay-Berwertung und ich verzichtete auf den ganzen Rechtsanspruch und Käuferschutz. Dafür nahm ich das Gerät unter die Lupe.

Auf den ersten Blick sieht das Innenleben recht ordentlich aus. Wenn man aber genauer hinsieht, dann erkennt man eine Verarbeitung nach "Fernostqualität". Der MST6M181VS-LF-Z1 Videoprozessor Chip beispielsweise, wurde bei der Bestückung scheinbar nicht exakt positioniert und leicht verdreht festgelötet. Auch war zwischen den Pads und den Anschlussbeinchen des IC´s ein Spalt zu erkennen. Und hier ist auch das Problem. Als ich testweise mit den Fingern Chip und PCB zusammendrückte, startete der Upscaler und zeigte am ein TV ein kleines Infofenster mit Auflösung und Scanfrequenz.
IC ist schlecht positioniert
Das bedeutet, dass es hier Verbindungsprobleme gibt. Also startete ich den Versuch, mit der Reworkanlage und einwenig Kolophonium, den Chip nachzulöten. Das gelang auch, und der Scaler startet jetzt immer zuverlässig.

Nachlöten mit Heißluft
Aber leider hielt das nur kurze Zeit, er startet zwar immer noch, zeigt aber nur mehr wirre Pixel und bunte Flächen an. Vermutlich hat der Reworkprozess den Chip zu sehr gestresst und ihm ein vorzeitiges Ende bereitet. Also noch einmal mit der Heißluft nachgelötet (kann ja sein dass immer noch eine Lötstelle nicht passt), aber das Ergebnis war dasselbe.