Arduino Spectrum Analyzer

From Frack - Hackerspace Friesland
Jump to navigationJump to search
Project: Arduino Spectrum Analyzer
ArduinoSA screenshot.png
Status voltooid
Betrokkenen
Afbeelding Anoniem.png Fludizz
Fludizz Rol: deelnemer Deskundig met: GL-Inet, Glasvezel lassen, Iptables, Linux, Netwerken, OpenVPN, Python, RaspberryPi, Software Beginnend met: ENC28J60 Werkt aan: Geen projecten :(
Kennisgebied(en) Arduino, Solderen, Elektronica
Projectcode Arduino-SpectrumAnalyzer
ProjectoverzichtProject toevoegen

Bij Nurdspace zijn BuZz en SmokeyD bezig met het bouwen van een op Arduino gebaseerde spectrum analyzer die de volledige WiFi band pakt (2.4GHz tot 2.5GHz). Ze verwachten hier binnenkort worden hiervan zelfbouwkitjes voor te maken.

Voor deze spectrum analyzer word ook zelf een Arduino gemaakt in plaats van een bestaande te gebruiken. Om wat meer bekend te worden met Arduino en de erbij te gebruiken randapparatuur leek het

Afbeelding Anoniem.png Fludizz
Fludizz Rol: deelnemer Deskundig met: GL-Inet, Glasvezel lassen, Iptables, Linux, Netwerken, OpenVPN, Python, RaspberryPi, Software Beginnend met: ENC28J60 Werkt aan: Geen projecten :(

interessant om deze opstelling alvast te maken met de voor handen hardware bij Frack.

Hardware

De volgende hardware en componenten zijn hiervoor nodig:

  • Arduino (Bij voorkeur met 3.3V voedings uitgang)
  • CYWM6935 Radio Module
  • 4x 2.2k Ohm weerstand
  • 4x 1k Ohm weerstand
  • 1x 10k ~ 100k Ohm weerstand (Pull-Up)
  • 10 draads flatcabel (met pin1 markering)
    • 10 pins 2.5mm strip
    • 2x 5 pins 2mm strip (Of de flatcable gewoon direct op de CYWM6935 solderen!)
  • Bread board
  • Bosje breadboard kabeltjes

Optioneel voor een LED op D2:

  • 1x LED
  • 1x 180 Ohm weerstand (Voorschakelweerstand)

CYWM6935

Deze module is in principe een Wireless USB module die via SPI communiceert. Er zit een 12 pins (2mm steek) header op de module. De pin-out van deze connector is als volgt:

Pin # Functie Arduino pin Beschrijving
1 GND GND
2 Vcc +3.3V Power
3 IRQ (Output) Dient voor interrupts verstuurd vanaf de radio. Word niet gebruikt.
4 nReset (Input) Pin D5/"PD5(T1)" Middels deze pin kan de radio gereset worden. +3.3V signaal.
5 MOSI (Input) Pin D11/MOSI Output SPI Master-Out/Slave-In, signaal moet +3.3V zijn.
6 nSS (Input) Pin D6/"PD6(AIN0)" SPI Slave-Select signaal, moet ook +3.3V zijn.
7 SCK (Input) Pin D13/SCK Output SPI Clock signaal, moet ook +3.3V zijn.
8 MISO (Output) Pin D12/MISO Input SPI Master-In/Slave-Out.
9 GND GND
10 nPD (Input) Power-down signaal, +3.3V met Pull-up weerstand om de module actief te houden.
11 N/C Niet in gebruik.
12 N/C Niet in gebruik.

Zoals in de tabel te lezen is, heeft deze module een lastigheid: Hij moet gevoed worden met 3.3 volt en de datalijnen zitten op dezelfde spanning. Als er 5 volt op gezet word brand de module door. De DK-Duino's op de space leveren gelukkig 3.3V voeding waarmee dat probleem in ieder geval opgelost is. Voor de datalijnen daarentegen moet er gebruik gemaakt worden van een Voltage divider.

Voltage divider

Deze voltage divider op de signaal lijnen is kinderlijk eenvouding te maken:

Voltage Divider op basis van weerstanden.
  • Vin is het +5V signaal vanaf de Arduino
  • R1 is een 1000 Ohm weerstand
  • R2 is de 2200 Ohm weerstand
  • Vout is het +3.3V (werkelijk 3.44V) signaal naar de CYWM6935

Deze oplossing is nodig voor MOSI, nSS, nReset en SCK inputs. Deze oplossing is NIET geschikt om de module mee te voeden, dit omdat de stroom teveel beperkt wordt door de weerstandswaarden.

Aansluitschema

Arduino SA schematic.png

In het bovenstaande schema staat de LED niet vermeld, indien de optionele LED gebruikt word, kan deze met de 180 Ohm weerstand tussen Android pin D2 en GND gehangen worden.

Software

De software voor de Spectrum Analyzer bestaat uit twee delen: Arduino code en Python code.

Arduino code

De code voor de Arduino is gebasseerd op de CYWM6935 Arduino driver van GitHub. De code in de arduino is een aangepaste versie van de "example" code CypressTest. De driver files zijn onaangepast, de arduino code is aangepast om wat meer opties/flexibiliteit te bieden. De code kan op GitHub gevonden worden.

Serial Output

Er zat in de Python code nogal veel "try-except" om invalide serial output af te vangen, dit kwam met zeer grote regelmaat voor.

Gebruiker Elmer.jpg Elmer
Gebruiker Elmer.jpgElmer de Looff (Elmer) Rol: niet-deelnemer Deskundig met: Arduino, ENC28J60, Elektronica, GnuCash, HTML, LPD8806, Linux, MediaWiki, Mercurial, Netwerken, OpenVPN, Programmeren, Python, SSH, Software, Solderen Beginnend met: Dm-crypt, Javascript Werkt aan: Geen projecten :(

kwam ermee dat er mogelijk problemen waren met de serial output buffer van de arduino, dit bleek correct. Een enkele sweep van de Arduino duurde ongeveer een halve seconde en per sweep werd er zoveel data gegenereerd dat de Arduino buffer vol liep voordat deze over de serial (57600 baud) kon verzenden. Een grove berekening kwam uit dat er voor elk 1 MHz channel ongeveer 30ms aan tijd nodig was om de data over serial te sturen. Dit is opgelost door simpelweg een delay(20) in de code te zetten per channel, een channel kost ongeveer 10ms.

Een andere oplossing zou zijn om het aantal samples wat gebruikt word per kanaal omhoog te gooien naar 25, dit zou de delay(20) waarschijnlijk overbodig maken.

Python code

De python code maakt gebruik van pyserial voor communicatie en matplotlib voor het maken van de grafieken. Het resultaat wat op het scherm getoont word is een rode lijn voor de huidige meting en een rode stippellijn voor de vorige meting. Aan de python code word momenteel nog hard gewerkt, hij is echter al beschikbaar op GitHub.

Pics