Vis indlæg

Denne sektion tillader dig at se alle indlæg oprettet af dette medlem. Bemærk at du kun kan se indlæg der er oprettet i områder du i øjeblikket har adgang til.


Emner - Jakobsen

Sider: [1]
1
Arduino & Lign. / Audio Spectrum analyzer FFT / Disco lys
« Dato: Maj 18, 2017, 19:20:57 »
Hej

Jeg roder lidt med at lave noget styring af en programmerbar RGB led strip baseret på HL1606 .
Jeg benytter Arduino UNO.
Jeg kan sagten styre LED som jeg gerne vil med forskellige effekter (løb, blink mm)

Men nu kommer det lidt mere kompliceret, at styre det til musik,
Jeg har en electret mikrofon og en op-amp LM324 (single supply 5V) hvor jeg har laver en Virtuel GND på 2,5V, så jeg kan få et fint analog signal som er offset omkring 2,5v for at gøre Analog indgangen glad på Arduinoen.

I softwaren bruger jeg så #include "arduinoFFT.h"

Først havde jeg tænkt at ville prøve at lave noget "Beat Detect" som kunne finde rytmen i music, efter at have søgt og læst en masse ser det ud til at være mere kompliceret end "bare lige"

Nu har jeg så lavet en mere simpel løsning hvor jeg tænder LED hvis der er over et bestemt niveau på en given frekvens.

Umiddelbar virker det så meget at det blinker til musik, desuden hvis jeg tilslutter en tone generator og sweeper fra f. eks 100Hz til 2Khz så tænder led også ca som forventet, men det virker ikke helt overbevisende.

Så jeg leder efter nogle ideer til at gøre det bedre.

Kode:
#define CHANNEL A0
const uint16_t samples = 128; //This value MUST ALWAYS be a power of 2
double samplingFrequency = 8000;
unsigned int delayTime = 0;
double vReal[samples];
double vImag[samples];

i setup
Kode:
  analogReference(DEFAULT);
   if(samplingFrequency<=1000)
    delayTime = 1000/samplingFrequency;
  else
    delayTime = 1000000/samplingFrequency;
  // nothing to do!
}

i loop kalder jeg Spectrum konstant
Kode:
/**********************************************/
// FFT!
void Spectrum() {

for(uint16_t i =0;i<samples;i++)
  {
   vReal[i]=0;
   vImag[i]=0;
  }
    for(uint16_t i =0;i<samples;i++)
  {
    vReal[i] = double(analogRead(CHANNEL));
    if(samplingFrequency<=1000)
      delay(delayTime);
    else
      delayMicroseconds(delayTime);
  }
  FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD);  /* Weigh data */
  FFT.Compute(vReal, vImag, samples, FFT_FORWARD); /* Compute FFT */
  FFT.ComplexToMagnitude(vReal, vImag, samples); /* Compute magnitudes */
//  double one_freq = ((5 * 1.0 * samplingFrequency) / samples);v

//    double x = FFT.MajorPeak(vReal, samples, samplingFrequency);
//  Serial.println(x, 6);


       int bass0 = vReal[4]  > 300*2;
       int bass1 = vReal[8]  > 300*2;
       int bass2 = vReal[12]  > 300*2;
       int bass3 = vReal[16]  > 300*2;
       int bass4 = vReal[20]  > 300*2;
       int bass5 = vReal[24]  > 300*2;
       int bass6 = vReal[32]  > 300*2;
       int bass7 = vReal[48]  > 300*2;
       int bass8 = vReal[56]  > 300*2;
       int bass9 = vReal[64]  > 300*2;


  
  if (bass0) { strip.setLEDcolor(0, R);} else { strip.setLEDcolor(0, BLACK);}
  if (bass1) { strip.setLEDcolor(1, R);} else { strip.setLEDcolor(1, BLACK);}
  if (bass2) { strip.setLEDcolor(2, R);} else { strip.setLEDcolor(2, BLACK);}
  if (bass3) { strip.setLEDcolor(3, G);} else { strip.setLEDcolor(3, BLACK);}
  if (bass4) { strip.setLEDcolor(4, G);} else { strip.setLEDcolor(4, BLACK);}
  if (bass5) { strip.setLEDcolor(5, G);} else { strip.setLEDcolor(5, BLACK);}
  if (bass6) { strip.setLEDcolor(6, G);} else { strip.setLEDcolor(6, BLACK);}
  if (bass7) { strip.setLEDcolor(7, B);} else { strip.setLEDcolor(7, BLACK);}
  if (bass8) { strip.setLEDcolor(8, B);} else { strip.setLEDcolor(8, BLACK);}
  if (bass9) { strip.setLEDcolor(9, B);} else { strip.setLEDcolor(9, BLACK);}

strip.writeStrip();  

}

Er dette den rigtige måde at bruge FFT på?

  FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD);  /* Weigh data */
  FFT.Compute(vReal, vImag, samples, FFT_FORWARD); /* Compute FFT */
  FFT.ComplexToMagnitude(vReal, vImag, samples); /* Compute magnitudes */


Ideer modtages  :)

2
uProcessor / Dødt SD kort fra Raspberry Pi
« Dato: April 19, 2016, 12:34:11 »
Hej, jeg har en Raspberry Pi2 kørende med Kodi (XBMC mediaplayer) sammen med et TV og det virker super fint.

Normalt er der 5 volt på Rpi altid, men det kan ske at stømmen går f.eks ved rengøring.

Jeg opdage så at mit setup ikke virkede og at det var SD kortet (et 8GB Kingston micro HC) der var årsagen. (ved ikke om der evt. har været et strømudfald)

Lagde et nyt image på et kort magen til og Rpi virker fint igen.

Det der undre mig er at kortet slet ikke bliver set på min PC (Win7)  så jeg kan ikke formatere det, jeg kan heller ikke se det i SDformater eller i DiskManager.

Er det bare et defekt kort eller er det blot korrupt på en eller anden måde?

Jeg er klat over at Rpi kan korrupte et kort hvis software er ved at skrive til kortet og strømmen går og at mange "låser" det i read only men det går ikke normalt da linux jo godt kan li at skive på "disken"

Any hints?

3
Programmering / C# TCPIP non blocking client
« Dato: Maj 13, 2015, 13:55:07 »
Hej

Jeg er igang med et project hvor jeg skal styre nogle forskellige enhedder via TCPIP
jeg laver mit styreprogram i C# VS2010

Jeg har brug for hjælp til at i en C# Form at åbne 4 TCP clinet sockets og så sende data til de forskellige enhedder og også modtage fra det tilsluttet udstyr .

Jeg løber dog mod problemer med at min sockets er blocking og dermed går ting i stå hvis der ikke kommer data.

Med nonblocking mode et det lykkes at få 1 socket til at fungere men jeg kan ikke få 4 til at fungere.

Er der nogen der kan hjælpe med et eksempel på flere non blocking sockets samtidig i det samme program?

Jeg savner at det virker som når man har addet en eller flere serial connections

Jeg er meget tidspresset så al input er velkommen :-)


4
Arduino & Lign. / Raspberry Pi / Python / Socket
« Dato: April 08, 2015, 20:58:59 »
Hej
Jeg er igang med et Raspberry Pi projekt hvor jeg har følgende;

En Raspberry pi med i2c gpio expander hvor jeg på 8 bit har led's og 8 andre har push swithces
Jeg ønsker at styre led over IP fra en PC og bruger Socket + et TCP program på PC der kan sende cmd til Pi'en

Jeg har lavet et test program i python og det fungerer i de basale dele
Det venter på en connection og når jeg har connected så kan jeg sende simple cmd's som så tænder led's eller slukker
jeg kan også læse switches.... MEN kun når jeg spørger efter status med "sw" cmd

Problemet er at jeg ønsker at software læser switch status hele tiden så man kan detektere om nogen trykker på en knap, men hvis jeg læser switch status ved den linie der hedder

       data = c.recv(1024)

så læser den kun hver gang det kommer noget data fra PC
med andre ord så "hænger" koden her indtil der kommer data

Jeg kunne godt tænke mig at hvis ikke der er data så kan jeg læse switche alligevel og sende data til PC hvis nogen har trykket på en knap

Håber det giver mening og at der er en der har rodet mere med python end jeg har :-)

Kode:
from socket import *
 ## Import GPIO library
import RPi.GPIO as GPIO
import time ## Import 'time' library. Allows us to use 'sleep'
import serial
import smbus

bus = smbus.SMBus(1)    # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)

DEVICE = 0x20      #7 bit address (will be left shifted to add the read$
IODIRA = 0x00 # Pin direction register
OLATA  = 0x14 # Register for outputs
GPIOA  = 0x12 # Register for inputs

# Set all GPA pins as outputs by setting
# all bits of IODIRA register to 0
bus.write_byte_data(DEVICE,IODIRA,0x00)

# Set output all 7 output bits to 0
bus.write_byte_data(DEVICE,OLATA,0)

#port1 = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout=3.0)
port1 = serial.Serial("/dev/ttyAMA0", baudrate=250000, timeout=3.0)

 # Use physical pin numbers
GPIO.setmode(GPIO.BOARD)
#GPIO.setmode(GPIO.BCM)
 # Set up header pin 7 (GPIO7) as an output
GPIO.setup(12,GPIO.OUT)
host = "192.168.1.93"
print host
port = 7777
s = socket(AF_INET, SOCK_STREAM)
#s.setblocking(0)
print "Socket Made"
s.bind((host,port))
print "Socket Bound"
s.listen(5)
print "Listening for connections..."
port1.write("\r\nHello Wold:")

while True:
    c, addr = s.accept() # Establish connection with client.
    print 'Got connection from', addr
    c.send('Thank you for connecting')
    while True:
        data = c.recv(1024)

        if(data == "sw" ):
  # Read state of GPIOA register
         MySwitch = bus.read_byte_data(DEVICE,GPIOA)
         if MySwitch & 0b10000000 == 0b10000000:
          print "Switch 1 was pressed!"
         if MySwitch & 0b01000000 == 0b01000000:
          print "Switch 2 was pressed!"
         else:
          print "NOT pressed"

        if(data[0:3] == "led" ):
            print 'led'
            bus.write_byte_data(DEVICE,OLATA,ord(data[3]))
            print data

        if(data == "on" ):
            print 'pin 12 on'
            GPIO.output(12,True)

        elif(data == 'off' ):
            print 'pin 12 off'
            GPIO.output(12,False) ## Turn off GPIO pin 7

        elif(data == 'close' ):
            print 'closing connection'
            c.close()
            break

        elif(data == 'exit' ):
            print 'closing program'
            c.close()
            s.close()
            break
        else:
            print 'none'
print 'break'
GPIO.cleanup()
c.close()
s.close()

5
R/C & Modeltog / Anki racerbiler
« Dato: Juni 22, 2014, 23:19:17 »
Hej, faldt lige over disse nye racerbaner fra Anki.com
http://techcrunch.com/video/hands-on-with-the-new-anki-drive-2/517973734/
https://www.youtube.com/watch?v=PEGvqkED2iA
Hvordan virker aflæsningen af måtten så bilen kan finde ud af hvor den er er?
Må kunne bruges til mange andre ting  :)

6
Programmering / Altera FPGA Quartus II Cyclone V
« Dato: Juni 16, 2014, 17:14:36 »
Hej
Jeg rodder lidt med FPGA og har et Altera dev kit Cyclone V GT board med  "5CGTFD9E5F35C7" chip.
Jeg tror jeg har rimelig god forståelse for hvordan en FPGA fungere og har lavet en hel del test med verilog og vhdl samt schematics. Kan godt få tingene til at virke så det er også helt fint.

Men så kommer udfordringen, når jeg begynder at presse FPGA'en med højere clock frekvens og større logic løsninger så kan jeg ikke kommer så højt op i frekvens som forventet.
Har rodet med chip planer og placer logic blocks strategisk hvilket hjælper lidt.
Det er lidt ligesom om at det er tilfældigt hvad compileren kommer frem til af løsning fra gang til gang.
Jeg er ganske klar over at det formentlig er routing af signaler mere en den logiske løsning der er problemet.

Næsten lige meget hvad jeg gør kommer jeg ikke meget højere end ca. 250 Mhz
Hvis jeg laver noget meget simpelt kan jeg godt komme over 300Mhz.
Havde faktisk forventet at man kunne fylde FPGA'en meget og så længe man  har register (latch) mellem alle ALM's (LUT's, LE) så kunne den køre fuld hastighed op mod de 400 Mhz.
Håber der er andre herinde der roder med FPGA's og som ved lidt om hvordan man får mest ud af dem :-)
Det er super spændende og der er så mange muligheder

Vh. Jakobsen

Sider: [1]