Für das Science-Fair-Projekt meiner Tochter (Kategorie Informatik und Mathematik) möchte sie das RPi verwenden, um zu messen, ob verschiedene laute Geräusche über der Schmerzschwelle liegen und unsere Ohren schädigen. Sie ist eine Sechstklässlerin, hat aber Erfahrung mit RPi und Programmierung in Python. Phillip Heels Nichols hat einige Fragen auf der FB RPi-Seite beantwortet, aber vorgeschlagen, dass wir hierher kommen, um weitere Hilfe zu erhalten. Sie möchte den Pi mit einem Schalldruckmesser (ich habe einen davon) kalibrieren, um herauszufinden, wie viele Millivolt produziert werden
Folgendes denken wir bisher. Wir haben einen ADC (MCP3008) von Adafruit gekauft und warten auf seine Ankunft. Funktioniert dieses einfache Programm, wenn wir den digitalen Ausgang des ADC mit dem GPIO-Pin 11 und den GPIO-Pin 12 mit einer roten LED verbinden?
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.IN)
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,GPIO.LOW) #make sure LED is off
SPL=0 #zero the variable
While SPL<??: #Where ?? is the value in millivolts produced by a sound at 130 db
SPL=GPIO.input(11) #get value from adc connected to microphone
GPIO.output(12,GPIO.HIGH) #turn LED on if the sound level is higher than ??
Wenn dies funktionieren würde, welcher Code könnte am Ende eingefügt werden, um das Programm per Knopfdruck zurückzusetzen, der mit den GPIO-Pins verbunden ist? Sie möchte, dass dies portabel ist, sodass sie keine Befehle eingeben kann, um das Programm erneut auszuführen.
Antworten:
Die Verwendung des SPI-Busses durch einfaches Verbinden des Digitalausgangs des ADC mit Pin 11 des RPi-GPIO funktioniert nicht. Dieser Bus benötigt noch ein paar Drähte, 4 um genau zu sein.
Der ADC benötigt außerdem einen SPI-Eingang, Clock- und Chip Select-Pins, die angeschlossen sind, um ordnungsgemäß zu funktionieren. Glücklicherweise gibt es hierzu gute Informationen aus mehreren Quellen.
Wenn Sie etwas mehr über die Arbeitsweise von SPI erfahren möchten, empfehle ich zunächst, diese Seite auf Wikipedia zu lesen , um SPI ein wenig besser kennenzulernen.
Zweitens gibt es eine sehr schöne Tutorial von Adafruits , die genau dieses Thema diskutiert, enthält es Python - Code und führt Sie durch die Prozesse des Verbindens des ADC selbst und die Kommunikation mit ihm. Ein (kleiner) Nachteil ist, dass der in diesem Tutorial verwendete Code nicht den SPI-Port selbst verwendet, sondern den SPI-Bus emuliert (Bit-Banging genannt). Dies bedeutet, dass Sie die Pins am GPIO-Port freier verwenden können Sie wollen.
Ich nehme an, für Ihr relativ einfaches Projekt (obwohl ich heutzutage glücklich überrascht bin, dass Schüler der 6. Klasse diese Art von Aufgaben erledigen! Für sie werden durch diese Art von Projekten viele neue Informationen auf sie geworfen) wird die Bit-Banging-Lösung genau funktionieren fein. Ein Vorteil der Verwendung von Bit Banging besteht darin, dass es für Lernzwecke besser geeignet ist, da Sie alle SPI-Signale selbst erstellen und der Prozessor nichts automatisch ausführt, sodass Sie am Ende viel bessere Kenntnisse über SPI und serielle Kommunikation im Allgemeinen erhalten!
Vielleicht ist es eine gute Idee, mit den Beispielen von Adafruit zu beginnen und zu einem späteren Zeitpunkt die Hardware-Implementierung auf dem RPi für SPI zu verwenden. In diesem Fall benötigen Sie das Datenblatt (auch praktisch , wenn Sie die Adafruit-Software-Implementierung verwenden). , Kapitel 5 und 6 beschreiben die Kommunikation und was für die Verwendung des ADC konfiguriert werden muss.
quelle
Für Hardware-SPI mit MCP3008- und Adafruit_MCP3008- und Adafruit.SPI-Python-Bibliotheken:
Ich habe versucht, die Funktion set_clock_frequency ('Wert in Hz') des SpiDev-Objekts der Adafruit.SPI-Bibliothek zu optimieren. Also so etwas wie
Ich wollte eine Abtastrate von 5 kHz (5 V wurden an MCP3008 abgegeben), aber das Raspberry Pi Modell 2 B ergab eine serielle UHR von 25 kHz, wenn es auf DSO beobachtet wurde. Für eine Abtastrate des analogen Eingangssignals von 5 kHz sollte die serielle CLK von Pi 90 kHz betragen (18-fache Abtastrate, wie im Datenblatt MCP 3008 angegeben). Selbst dies konnte jedoch nicht helfen und die Dinge bleiben unverändert, während das Python-Skript ausgeführt wird.
Es ist auch überraschend, dass derselbe Code, der auf SPYDER IDE unter RPi ausgeführt wurde, in 1 Sekunde 1006 Werte druckte, was auf eine verbesserte Abtastrate hinweist, wobei die Einstellungen im Gegensatz zur eingebauten Python-2-Shell auf 1 kHz gehalten wurden.
quelle