24 Mayıs 2016 Salı

WS2811 controller (rgb led kontrolü)

Python Code :

import serial,time, pymouse

import thread
import gtk.gdk


mouse = pymouse.PyMouse()
ser = serial.Serial("/dev/ttyACM0",115200,bytesize=8,timeout=.1,parity="N",\
                    stopbits=1,)

class _get_pxc:
    def __init__(self):
        self.color = "000000"
        self.old_color = ""

    def pixel_at(self,x, y):
        rw = gtk.gdk.get_default_root_window()
        pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 1, 1)
        pixbuf = pixbuf.get_from_drawable(rw, rw.get_colormap(), x, y, 0, 0, 1, 1)
        return tuple(pixbuf.pixel_array[0, 0])
    def send_ardu(self,passarg):
       
        while True :

            s = mouse.position()
          
            self.color = self.pixel_at(s[0],s[1])
            if self.color != self.old_color :
                d = "".join("%0.2x"%f for f in self.color) + "\n"
                ser.write(d)
                time.sleep(0.01)
                while not ser.inWaiting():
                    time.sleep(.01)
                z = ser.read(ser.inWaiting())
                self.old_color = self.color         
                time.sleep(0.01)

get_pxc = _get_pxc()
thread.start_new_thread(get_pxc.send_ardu,(None,))

while True: time.sleep(0.1)


Arduino Code:

#include <FastLED.h>



#define LED_PIN     3
#define NUM_LEDS    3
#define BRIGHTNESS  255
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];


String inData;
String rs = "000000";
long r, g, b ;


void setup() {
  Serial.begin(115200);
 
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

}

void loop(){
    while (Serial.available() > 0)
    {
        char recieved = Serial.read();
        inData += recieved;

        // Process message when new line character is recieved
       if (recieved == '\n')
        {
            int boy = inData.length() - 1;
         
            if(boy == 6){
              rs = inData.substring(0,6);
              long number = strtol( &rs[0], NULL, 16);
              long r = number >> 16;
              long g = number >> 8 & 0xFF;
              long b = number & 0xFF;
              for(int id = 0; id < 3; id++){
                leds[id] = CRGB(g,r,b);               
                }
            FastLED.show();
           
           

           
            rs = "";

            }
            delay(10);
            Serial.print(inData+"\n");



            inData = ""; // Clear recieved buffer
        }
    }
}

12 Mayıs 2016 Perşembe

Kendinden uyartımlı jeneratörler (self exciting generators)

Bu jeneratörlerde en önemli parça AVR yani voltaj regülatörüdür. Herhangi bir bağlantısının çıkması/kopması durumunda jeneratörünüzün tahrik yada tahrik redresörün yanmasına sebep olabilir.
Kesinlikle test etmeden önce  AVR bağlantılarını kontrol edin.

Genelde buna benzer bir bağlantı mevcuttur. Böyle bir şemada fırçalı bir aktarım söz konusudur, bakım maliyetlerinden dolayı genelde fırçasız imal edilirler.

Fırçasız bir jeneratör için çalışma şekli :
Alan (F+, F-) oluşan manyetik alan uyartım armatüründe 3 faza döner doğrultulup aynı mil üzerindeki ana armatür sargılarına iletilir. Ana armatürdeki manyetik alan ana çıkış sargılarını tahrik eder.

Raw soket hataları

Her ne kadar Unix sistemlerde RAW soket çok pratik gözükse de aslında kullanımda bir çok problemler vardır.
Bu hataların bazıları(benim başıma gelenler) :
  1. Haddinden büyük paketler (Normalde gönderiyorsanız raw da göndermeniz gerekir), message to long gibi bir hata yükseliyorsa o zaman ethernet kartınıza tecavüz etmekten vazgeçin uyarısı gibi bir uyarıdır.
  2. Aynı nesneyi hem gönderme hem de alma işlemi için kullanmayın. Her gönderimde soketinizin hızı (refleksi) daha da düşer. Minimal TCP (donanım sekmesi) 50 ms gecikme olduğunu var sayarsak sürekli gönderimler donanım tampon belleğini aşacağı için kuyruk oluşur. Bu kuyruk sizin paket eşleştirme yada karşılaştırma işlemlerinizi sekteye uğratır.
  3.  İnternet soket tipi kesinlikle 3 (ALL, 0x0003) olmalıdır. Aksi takdirde donanıma gelen gövdesiz paketleri maalesef görüntüleyemezsiniz.
  4. Dinleme objesinde (server) tampon boyutunu 65535 yapın ki bazı paketler standart paket boyutunu (< 1600) aşmaktadır. Paket boyutu (gelen) tampon değerinizin üzerine çıkarsa ya o paketi alamaz yada bozuk içerikli bir paket görüntülersiniz.
  5. Sanal ağ uygulamalarında mutlaka içkesme (interrupt) kullanmanız gerekir. Ayrıca her bir paket için(gönderme) yaklaşık 1 ms geçikme kullanın ki paketlerin yanıtlarını kontrol edebilin.
  6. Paket alımında (server) mutlaka filtre uygulayın. Paket başlıkları üzerinden yapacağınız filtre sizin alakasız paketleri işlemenize engel olacaktır, bu şekilde yazdığınız aplikasyon daha performanslı çalışacaktır. Filitrenin temel öğesi `source port mac` (kaynak port mac adresi) dır. Farklı bir filitre ancak ana filitrelerden sonra uygulanabilir.