วันอังคารที่ 16 มิถุนายน พ.ศ. 2558

ข้อมูลเบื้องต้นและวิธีใช้งาน ACS712 โมดูลวัดกระแส

ACS712 คือโมดูลที่ใช้วัดกระแสไฟฟ้า ซึ่งแต่ละ Packet จะมีความสามารถในการวัดค่ากระแสไฟฟ้าได้ไม่เท่ากัน โดยมีช่วงที่วัดได้ตั้งแต่ +-5A , +-20A และ +-30A ขึ้นอยู่กับ Packet ที่ใช้ และค่าเอาท์พุตที่ได้จะเป็นค่า Voltage ซึ่งเมื่อไม่มีกระแสไฟฟ้าไหลภายในในวงจรเลยจะได้ค่าแรงดันเอาต์พุตเท่ากับ Vcc/2 ถ้ากระแสไฟฟ้าที่วัดมีค่าเป็นบวก ค่าของแรงดันเอาต์พุตจะมากกว่า Vcc/2 และในทางตรงกันข้าม ถ้ากระแสไฟฟ้ามีค่าเป็นลบ ค่าแรงดันเอาต์พุตจะน้อยกว่า Vcc/2
โดยสูตรการคำนวนหากระแสไฟฟ้าเบื้องต้นจะได้ว่า 
Current = (Voutput - Vcc/2)/Output_sensitive 

วันอาทิตย์ที่ 7 มิถุนายน พ.ศ. 2558

[STM32F3] ทดลองอ่านค่าจาก ADC และส่งค่าผ่าน UDP Protocol

การทดลองอ่านค่าจาก ADC ของบอร์ด STM32F3Discovery และส่งค่าที่อ่านได้ไปยัง ENC28J60 Ethernet Module เพื่อส่งข้อมูลผ่านเครือข่ายโดยใช้ UDP Protocol โดยจะเป็นการจำลองการทำงานของการวัดกระแส และแรงดันของวงจรไฟฟ้า ซึ่งได้ต่อวงจรต่างๆ ดังนี้
ADC1 (Pin: PF2) ----------> Vcc +3V
ADC2 (Pin: PB2) ----------> Gnd
SPI3:
    SPI3_NCC (PA15) ----------> CS (ENC28J60 Module)
    SPI3_SCK (PC10) ----------> SCK (ENC28J60 Module)
    SPI3_MISO (PC11) ----------> SO (ENC28J60 Module)
    SPI3_MOSI (PC12) ----------> SI (ENC28J60 Module)

วันพฤหัสบดีที่ 4 มิถุนายน พ.ศ. 2558

[STM32F3] ทดลองใช้งาน ADC

ทดลองใช้งาน ADC1 ของบอร์ด STM32F3Discovery โดยจะทำการแปลงข้อมูลจาก Analog มาเป็น Digital จำนวน 10 บิต ซึ่งมีโค้ดสำหรับการทดลองการทำงานดังนี้

[STM32F3] ทดลองใช้งาน SPI

การติดต่อสื่อสารแบบ SPI (Serial Peripheral Interface) เป็นการสื่อสารแลกเปลี่ยนข้อมูลกันระหว่างชิปและอุปกรณ์อิเล็กทรอนิกส์ มีรูปแบบการรับส่งข้อมูลแบบบิตอนุกรม-ซิงโครนัส (synchronous serial data link) ซึ่งสามารถรับและส่งข้อมูลได้สองทิศทางพร้อมกัน (full-duplex) ในการติดต่อสื่อสารแบบ SPI จะประกอบด้วยอุปกรณ์สองส่วนที่เรียกว่า Master และ Slave สำหรับอุปกรณ์ Master จะทำหน้าที่เป็นตัวเริ่มต้นการรับส่งข้อมูล และอุปกรณ์ Slave จะทำหน้าในการตอบสนองเพื่อรับข้อมูลจาก Master หรือส่งข้อมูลให้ Master
การสื่อสารแบบ SPI จะใช้สายสัญญาณสำหรับระบบบัสทั้งหมด 4 เส้น คือ
1. SCLK : Serial clock เป็นสายสัญญาณนาฬิกาสำหรับการสื่อสารแบบ SPI ซึ่ง master จะเป็นฝ่ายสร้างสัญญาณและส่งไปเป็นอินพุตของ slave
2. MOSI : master output, slave input เป็นสายสัญญาณสำหรับส่งข้อมูลที่ master ต้องการส่งให้กับ slave
3. MISO : master input, slave output เป็นสายสัญญาณสำหรับส่งข้อมูลที่ slave ต้องการส่งกับ master
4. /SS: slave select เป็นสายสัญญาณที่ master จะเป็นฝ่ายสร้างสัญญาณให้กับ slave ใช้สำหรับให้ master เลือกติดต่อกับ slave ตัวใดตัวหนึ่งซึ่งจะทำงานแบบ Active Low


สำหรับการทดลองใช้งาน SPI ของบอร์ด STM32F3Discovery จะเป็นการทดลองใช้งาน SPI1 โดยใช้งานแบบ Full Duplex Master และขนาดของข้อมูล 8 บิต เริ่มต้นส่งที่บิต MSB ก่อน และใช้งานใน SPI โหมด 1

วันพุธที่ 3 มิถุนายน พ.ศ. 2558

ข้อมูลเบื้องต้น ENC28J60 Ethernet

ENC28J60 Ethernet module เป็น module ที่มีคุณสมบัติในการทำ Internet protocol ใช้ microship EN28J60 ในการทำงาน ซึ่งคุณสมบัติคราวๆของ module ชิ้นนี้มีดังนี้

  1. ใช้บัส SPI เป็น interface ในการเชื่อมต่อกับโมดูล
  2. รองรับการใช้งาน TCP/IP protocal, IPv4, UDP, TCP, DHCP, ICMP, FTP และ HTTP
  3. ใช้แรงดันไฟเลี้ยง 3.3v
  4. ความถี่ของสัญญาณ clock ที่ป้อนให้กับ Ethernet โมดูล 25MHz

ทดลองสตรีมกราฟผ่าน Plotly และการใช้งาน Socket UDP

plotly เป็นเว็บไซต์ที่ให้บริการแสดงผลกราฟต่างหลายรูปแบบ ซึ่งรองรับได้หลายภาษาทั้ง python , json , javascript เป็นต้นอีกทั้งยังมี  และ Socket เป็น Library ของ Python ที่ใช้ติดต่อกับระบบเครือข่ายเพื่อใช้เชื่อมต่อระหว่างคอมพิวเตอร์กับ Board STM32 



โดยวิธีการทดลองได้แยกออกเป็นสองส่วนดังนี้

ส่วนของ Plotly 
  1. ดาวโหลด Library ของ Plotly มาใช้งาน ใช้ terminal "pip install plotly"(ในเครื่องต้องติดตั้ง PIP ก่อนแล้ว) จากนั้นก็สมัครเป็นสมาชิกในเว็บไซต์ Plotly เพื่อนำ API Key, TOKEN มาใช้งาน โดยรหัส API Key, TOKEN จะอยู่ในหน้า https://plot.ly/settings/api (เข้าได้เมื่อ Login ใช้งานแล้ว)
  2. การเริ่มใช้งานก่อนอื่นต้อง import Plotly มาใช้งานแล้วเขียนโค้ดในส่วน Login ดังนี้โค้ดข้างล่าง เพื่อใช้สื่อสารกับ Plotly server
  3. import plotly.plotly as py  
    # (*) Useful Python/Plotly tools
    import plotly.tools as tls   
    # (*) Graph objects to piece together plots
    from plotly.graph_objs import *
    
    py.sign_in('ีusername', 'API_key')
  4. จากนั้นก็เขียนโค้ดตามข้างล่างนี้ Stream_ids คือ TOKEN โดยเก็บในรูปแบบอาร์เรยสามารถเพิ่มได้เรื่อยๆ TOKEN 1อัน เอาไว้ใช้ต่อ การ Stream 1 เส้น จากนั้นก็สร้าง Stream ออปเจค โดยระหว่างสร้างสามารถกำหนดจุดที่แสดงใน Stream ได้
  5. stream_ids=["token1", "token2", "token3"]
    tls.set_credentials_file(stream_ids)
    
    stream = Stream(
        token=stream_id,    # link stream id to 'token' key
        maxpoints=80        # keep a max of 80 pts on screen
    )
  6. ใส่เส้น ,layout(default) ลงในออปเจคภาพและสร้าง url ชื่อของ stream รายละเอียดการปรับแต่ง Layout นี้จะกล่าวอีกครั้งในบทความอื่นลิงค์
  7. //make line
    trace1 = Scatter(
                x=[],
                y=[],
                mode='lines+markers',
                stream=stream       # embed stream id, 1 per trace
     )
            
    data = Data([trace1])
            
     # Add title to layout object
     layout = Layout(title="titleName")
            
     # Make a figure object
     fig = Figure(data=data, layout=layout)
            
     #(@) Send fig to Plotly, initialize streaming plot, open new tab
      unique_url = py.plot(fig, filename="name" )
    
  8. เริ่มการทำงาน Stream และใส่ข้อมูล
  9. s = py.Stream(stream_id)
            
    #(@) Open the stream
    s.open()
    
    for i in range(51):
        s.write(dict(x=i,y=i))
  10. เมื่อเรารันได้แล้ว python จะเปิดแทป browser ไปที่กราฟ ตัวอย่างชื่อลิงค์ https://plot.ly/~username/221/titlename/
  11. สามารถที่จะนำกราฟจาก page นั้นมาใช้งานใน page ของเราได้ โดยใช้โค้ดนี้ สามารถปรับความกว้างความยาวของการแสดงรูปกราฟได้ผ่านส่วนนี้
  12. <iframe frameborder="0" height="480" scrolling="no" seamless="seamless" src="https://plot.ly/~username/221.embed?width=640&height=480" width="640">
    
  13. ตัวอย่าง
บทความต่อในส่วนการเปลี่ยนแปลงค่าต่างๆใน Plotly ลิงค์

ส่วนของ UDP
  1. server_test.py ได้เซ็ตค่าให้เป็น Broadcast พร้อมกับ เซ็ต timeout เมื่อไม่มีการเชื่อมต่อในทุกๆ 5 วินาที
  2. import socket,SocketServer
    
    print 'Server started...' 
    host, port = '0.0.0.0',42000 #set host and port
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    
    server.bind((host,port))#start server
    server.settimeout(5)
    
    while(True):
        try:
            (R_data, addr) = server.recvfrom(65535)
            print 'from', str(addr),"data is", R_data
            server.sendto("recieved", addr)
        except socket.timeout:
            print "out"
  3. client_test.py ส่งข้อความไปหา server_test.py และรอรับข้อความยืนยันการรับจาก server
  4. import socket,SocketServer ,time
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    data = "test"
    host, port = "127.0.0.1",42000 #set host and port
    for i in range(10):
        time.sleep(1)
        sock.sendto(data, (host, port))
        (R_data, addr) = sock.recvfrom(65535)
        print R_data
  5. จะได้ดังนี้