วันอังคารที่ 4 พฤศจิกายน พ.ศ. 2557

format sd-card

สวัสดีครัช พี่น้อง
หายกันไปนานเบย(อีกแล้ว) คราวนี้มาบอกเกร็ดเล็กเกร็ดน้อยครับ

เมื่อเรานำ sd-card ไปลง image rasbian แล้ว เมื่อเราถอด sd-card ไปเสียบที่เครื่อง pc เราจะเห็นพื้นที่เหลืออยู่นิดเดียว ซึ่งถ้าเราต้องการ format ทั้งหมดเพื่อนำไปใช้อย่างอื่นต่อ จะมีวิธีการดังต่อไปนี้ครับ

1. download โปรแกรม SD Formatter ก่อน ถ้าเราใช้เครื่อง pc windows ก็เลือกของ windows ถ้าเราใช้เครื่อง pc mac ก็เลือกของ mac


รูปที่ 1 download โปรแกรม SD Formatter

2. install SD Formatter
3. เปิดโปรแกรม SD Formatter แล้วเลือก drive ที่เสียบ SD Card ไว้


รูปที่ 2 โปรแกรม SD Formatter

4. เลือก option
5. เลือก format size adjustment เป็น on แล้วกด ok


รูปที่ 3 size adjustment


6. คลิก format และ ok


รูปที่ 4 หลังจาก Format เรียบร้อยแล้ว

size ของ sd card ก็จะกลับมาใหญ่เหมือนเดิม

วันจันทร์ที่ 13 ตุลาคม พ.ศ. 2557

การตั้งวันที่ เวลา ให้ raspberry pi

การตั้งวันที่

sudo date mmddHHMMCCYY

mm = เดือน
dd = วันที่
HH = ชั่วโมง
MM = นาที
CCYY = ปี เช่น 2014

ยกตัวอย่างเช่น เดือน 10 วันที่ 13 15.50 น. ปี 2014
sudo date 101315502014

แล้วลองใช้คำสั่ง date ดูครับ เวลาควรจะเปลี่ยนตามที่เราได้ตั้งไว้

ที่มา
http://spalinux.com/2012/04/change-linux-date-time-using-command-date




ข้อความด้านล่างนี้ ผู้เขียนได้ลองแล้ว แต่ไม่ได้ผล อาจจะเพราะ ทำไม่ถูกเอง หรือ ไม่ได้ผลจริงๆ ก็ไม่แน่ใจเหมือนกัน ใครทำได้ ลองช่วยมาแชร์ให้หน่อยก็ดีครับ จะขอบคุณอย่างยิ่ง


แต่หลังจากตั้งวันที่ให้ Rpi แล้ว เราก็จะเกิดปัญหาใหม่ คือ เมื่อเราปิดไฟหรือ shutdown ไปแล้ว แล้วมาเปิดเครื่องใหม่ เวลาของ Rpi จะไม่ update
ดังนั้นเราต้องมี script ไว้สำหรับ update time เมื่อฟื้นขึ้นมาใหม่ แต่วิธีนี้ก็มีเงื่อนไขอยู่ตรงที่ว่าต้องต่อ internet ด้วย


Before you use the script, you'll need to install ntplib. The download link and installation instructions are here:https://pypi.python.org/pypi/ntplib/.
Copy the the contents of the code below to a file (I named mine "synctime.py"). Then, after the network is running, execute the script (e.g. "python synctime.py"). You will need to do this using elevated (root) privileges for this to work properly.

import time
import os

try:
    import ntplib
    client = ntplib.NTPClient()
    response = client.request('pool.ntp.org')
    os.system('date ' + time.strftime('%m%d%H%M%Y.%S',time.localtime(response.tx_time)))
except:
    print('Could not sync with time server.')

print('Done.')

ที่มา
http://stackoverflow.com/questions/5222951/easy-way-to-get-the-correct-time-in-python



วันนี้ 06/12/2559 ผมมีโอกาสได้ลองใหม่ ดังนี้
sudo apt-get udpate
sudo apt-get install ntpdate
sudo raspi-config
เข้าไปตั้งค่า time zone ให้เป็น asia/bangkok
เรียบร้อย


วันศุกร์ที่ 10 ตุลาคม พ.ศ. 2557

ทำ printer ธรรมดาให้เป็น wireless printer

เดี๋ยวผมจะลองทำดู ตามนี้เลย http://www.instructables.com/id/Turn-any-printer-into-a-wireless-printer-with-a-Ra/
หรือว่าใครทำแล้ว ลองมา update ให้ดูกันหน่อยก็ได้นะครับ

วันพุธที่ 1 ตุลาคม พ.ศ. 2557

python รับค่าจาก keyboard, อ่านค่าเวลา, การเปิดไฟล์ ปิดไฟล์ อ่านไฟล์ เขียนไฟล์, ออกจากโปรแกรม, keyboard interrupt, การหาบรรทัดล่างสุดของไฟล์, การแยก text ด้วย split

สวัสดีครัชพี่น้อง

วันนี้เป็นเกล็ดเล็กเกล็ดน้อย เกี่ยวกับการเขียนโปรแกรม python script บน RPi ครับ

การรับค่าจาก keyboard
ก็ง่ายๆครับ ตามนี้เลย
number = input("please input your choice : ")
ที่มา
https://sites.google.com/site/dotpython/input-and-output/2-2-list



การอ่านค่าเวลา
import time
my_time = time.time()
ที่มา
http://tutor0x.blogspot.com/2011/11/python_19.html

การ เปิด, write, close file
example_file = open('your_file_name.txt', 'w')
example_file .write("hello world\n")
example_file .close()
ที่มา
http://citecclub.org/forum/python-articles-59/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%9B%E0%B8%B4%E0%B8%94%E0%B9%84%E0%B8%9F%E0%B8%A5%E0%B9%8C%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2%E0%B9%84%E0%B8%9E%E0%B8%98%E0%B8%AD%E0%B8%99-1151/

http://www.mindphp.com/%E0%B8%9A%E0%B8%97%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B8%AD%E0%B8%AD%E0%B8%99%E0%B9%84%E0%B8%A5%E0%B8%99%E0%B9%8C/83-python/2676-%E0%B8%9F%E0%B8%B1%E0%B8%87%E0%B8%81%E0%B9%8C%E0%B8%8A%E0%B8%B1%E0%B9%88%E0%B8%99%E0%B9%80%E0%B8%81%E0%B8%B5%E0%B9%88%E0%B8%A2%E0%B8%A7%E0%B8%81%E0%B8%B1%E0%B8%9A-%E0%B9%84%E0%B8%9F%E0%B8%A5%E0%B9%8C--python.html

http://stackoverflow.com/questions/4488570/how-do-i-write-a-tab-in-python


การออกจากโปรแกรม
import sys
sys.exit()


keyboard interrupt

To solve the exception problem, add a separate except-clause that catches theKeyboardInterrupt exception, and raises it again:
for record in database:
    try:
        process(record)
        if changed:
            update(record)
    except KeyboardInterrupt:
        raise
    except:
        # report error and proceed
or, even better:

for record in database:
    try:
        process(record)
        if changed:
            update(record)
    except (KeyboardInterrupt, SystemExit):
        raise
    except:
        # report error and proceed



การหาบรรทัดล่างสุด


  f = open('file.txt', "r")
  firstLine = f.readline()
  f.seek(-2,2)
  while f.read(1) != "\n":
    f.seek(-2,1)
  last = f.readline()

  print "Last Line: %s" %(last)

ที่มา
http://stackoverflow.com/questions/3346430/most-efficient-way-to-get-first-and-last-line-of-file-python


การแยก text ด้วย split

จากตัวอย่าง "การหาบรรทัดล่างสุด" เราได้ตัวแปรที่ชื่อว่า last ที่เก็บข้อมูลของบรรทัดสุดท้ายอยู่
โดยเมื่อเราใช้ method "split" เราก็จะได้ข้อมูลใหม่ ที่เป็น array ออกมา
มีวิธีการใช้ ดังตัวอย่างต่อไปนี้

สมมติว่าใน ตัวแปร last มีข้อมูล "1\t2\n" import array


a = last.split("\t",1) ======================== (1)

print str(a[0]) ========================(2)
print str(a[1]) ========================(3)

(1) แยกข้อมูลโดยใช้ \t เป็นจุดแยกข้อมูล จากตัวแปร last แล้วเก็บไว้ในตัวแปร array a
(2) สั่ง print ค่าที่อยู่ในตัวแปร array a ตัวที่ 0 ซึ่งผลลัพธ์ออกมาคือ "1"
(3) สั่ง print ค่าที่อยู่ในตัวแปร array a ตัวที่ 1 ซึ่งผลลัพธ์ออกมาคือ "2"

วันจันทร์ที่ 29 กันยายน พ.ศ. 2557

python print จากข้อมูลที่เป็น int ให้เป็น string

ถ้าเราต้องการจะ print ข้อมูลที่รับมาเป็น int โดยให้แสดงผลในรูปของตัวอักษร (string)
ให้ใช้ chr(x) นะครัช
(งงอยู่เป็นชั่วโมง เฮ้ออออ)


def WaitResponseVR(DataNum):
  rcv = port1.read(DataNum)
  if rcv != '':
   return ord(rcv)  ============== แปลง character ตัวเดี่ยวๆ เป็นค่า integer.
  else:
    return ''"


for y in range (0,72):
    ans = WaitResponse(1)
    if ans == "":
      print "No response"
    else:
      Data += chr(ans) ================== แปลงจาก int เป็น string
  print Data

การต่อพ่วงอุปกรณ์หลายๆตัวบน Rpi

บางครั้งเราอาจจำเป็นต้องต่ออุปกรณ์หลายๆอย่างเข้ากับ Rpi ซึ่งอาจจะเป็นสาเหตุทำให้อุปกรณ์ของเราทำงานไม่สมบูรณ์ หรือ ไม่ทำงานเลย เนื่องจากกำลังไฟของ Rpi มีค่อนข้างจำกัด

วันนี้ผู้เขียนได้ต่อ usb to serial จำนวน 2 ตัวเข้ากับ Rpi
ตอนแรกก็ลองเขียน code ดู คิดว่าใช้ไฟแค่นี้ไม่น่าจะเป็นปัญหา แต่ทดลองไปทดลองมา ทำยังไง้ ก็ไม่มีอะไรส่งออกมาจาก serial เลย

เลยเอะใจ ไหนลองต่อ usb hub แล้วทดสอบดูใหม่ซิ

ออกเฉย!!!

work ซะงั้น

import serial
import time

port = serial.Serial("/dev/ttyUSB0", baudrate=19200, timeout=1.0)
port = serial.Serial("/dev/ttyUSB1", baudrate=19200, timeout=1.0)

while 1:
  port.write(chr(0x01))
  time.sleep(1)





เวลาท่านใดทำโปรเจคด้วย Rpi แล้วมีอุปกรณ์ต่อพ่วงเยอะหน่อย แต่ทำแล้วไม่ work ก็ลองใช้ usb hub ดูนะครับ :)

วันอังคารที่ 23 กันยายน พ.ศ. 2557

python serial read

วันนี้ได้เขียนหลายเรื่องเลย งานเร่งด่วนมาก
ตอนนี้จะเกี่ยวกับการอ่านค่า ที่ได้รับจาก serial port

ตัวอย่าง code

#! /usr/bin/python

import time
import serial

port = serial.Serial("/dev/ttyUSB0", baudrate=19200, timeout=1.0)

i = 1

while 1:
  port.write(chr(i))
  rcv = port.read(1) ================== (1)
  if rcv != '':================== (2)
    ans = ord(rcv) ================== (3)
    if ans == 0x61:
      print "Status Ready"
    else:
      print rcv
  else: ================== (4)
    print "Loss communication"


(1) คืออ่านค่าจาก serial port ใส่ในตัวแปร rcv
(2) ตรวจสอบว่าค่า rcv ที่อ่านมา มีค่าอะไรอยู่หรือไม่ ถ้ามีก็ทำต่อไป ถ้าไม่มีก็กระโดดไปที่ (4)
(3) เปลี่ยนตัวแปร rcv ที่เป็น string ให้เป็น int เพื่อที่เราจะสามารถเปรียบเทียบค่ากับ hex ที่เราต้องการได้


ที่มา http://stackoverflow.com/questions/12929593/how-to-test-for-hexidecimal-output-on-serial-port-in-python

python port.write

ในการเขียน python ให้ส่งออกข้อมูลผ่าน serial port มีอยู่ 2-3 แบบ ที่ผู้เขียนเจอมา

โดยมีตัวอย่าง code ดังต่อไปนี้

import serial
import time

port = serial.Serial("/dev/ttyUSB0", baudrate=19200, timeout=1.0)

while 1:
  port.write(chr(0x01))
  time.sleep(1)

โดยที่เห็นใน code ด้านบน จะส่งออกมาเป็น 0x01 ฐาน16 จริงๆ



แต่ถ้าเราเปลี่ยน code เป็น port.write("1") เราจะเห็นข้อมูลต่างออกไป คือ 0x31



แต่ถ้าเราเปลี่ยน code เป็น port.write("0x01")
สิ่งที่ RPi ส่งออกมาจะเป็น 0x30 0x78 0x30 0x31 ซึ่งถ้าเปลี่ยนเป็น ascii เราจะเห็นเป็น 0x01




สรุป
การส่งข้อมูล serial

port.write(chr(0x01))
port.write("1")
port.write("0x01")

ให้ผลที่ต่างกัน เราสามารถเลือกใช้ให้เหมาะสมกับงานของเราได้ครัช

python serial

สวัสดีครับพี่น้อง

วันนี้ได้ทำโปรเจคเกี่ยวกับ serial port ก็เลยต้องขอบันทึกไว้ก่อน กันลืม

เริ่มด้วย ที่บอร์ด RPi ให้พิมพ์
sudo apt-get install python-serial


ผู้เขียนได้ซื้อ USB to Serial มา และได้เสียบเข้ากับ RPi
ในตอนแรก RPi มองไม่เห็น USB to Serial ก็ได้ถอดแล้วเสียบใหม่ และถอดสาย power ออก แล้วเสียบสาย power ใหม่, RPi เลยมองเห็นเป็น ttyUSB0 โดยเราสามารถดูได้โดยใช้คำสั่ง ls /dev/

ต่อไปเราจะเริ่มเขียน code กัน
ให้สร้าง file ขึ้มาใหม่ด้วยคำสั่ง nano SerialExample.py
เขียน code ดังต่อไปนี้

import serial

port = serial.Serial("/dev/ttyUSB0", baudrate=115200, timeout=3.0)

while True:
    port.write("\r\nSay something:")
    rcv = port.read(10)
    port.write("\r\nYou sent:" + repr(rcv))

กด control+x กด Y กด Enter เพื่อ save และออกจากโปรแกรม

จากนั้นให้เราต่อสาย USB to Serial เข้ากับ computer ของเรา ดังรูป


ที่ computer ของเรา ให้เปิดโปรแกรมที่สามารถรับข้อมูลจาก comport รอไว้ โดยตั้งค่าให้ baudrate ตรงกันกับที่เราเขียนโปรแกรม python ไว้ คือ 115200

จากนั้นที่บอร์ด RPi ให้พิมพ์ sudo python SerialExample.py เพื่อ run program
เราจะเห็นได้ว่าที่ computer ของเรา โปรแกรมที่เปิดรอไว้ จะมีอักษรขึ้นมา ดังรูป


แล้วเราก็ลองกดส่งข้อมูลดู ให้ครบ 10 ตัว โปรแกรม python ที่เราเขียนไว้ ก็จะส่งข้อมูลเดิมกลับออกมาให้เราเห็น


เป็นอันว่าเราสำเร็จในการรับ-ส่งข้อมูลผ่าน USB to Serial แล้ว
จบ... :)

bitvise ssh client โปรแกรมสำหรับ ssh และ sftp

สวัสดีครับพี่น้อง

วันนี้ได้มีโอกาสลง putty ใหม่ ก็กำลังจะโหลด putty แต่พอดีเห็นว่ามีโปรแกรมอื่นให้โหลดด้วย เห็นว่าเป็น gui และก็น่าจะลองของใหม่ดู เลยลองโหลดมาใช้งานดู

เริ่มต้นด้วยไปที่ www.putty.org

ให้คลิกที่ download tunelier here จะเจอหน้าถัดไป


ให้คลิกที่ bitvise ssh client installer เพื่อ download

เมื่อโหลดมาเสร็จแล้วก็ทำการ install ต่อไป
พอลงเสร็จแล้ว เปิดโปรแกรมขึ้นมาจะเห็นหน้าตาแบบนี้


ให้เราใส่ ip ของ rpi ลงไป รวมถึง username และ password แล้วกด login
จะมีหน้าจอเด้งขึ้นมา 2 หน้าจอ โดยหน้าจอนึงเป็น ssh และอีกหน้าจอนึงเป็น sftp


ซึ่งดูแล้วก็น่าใช้ดี สะดวกดีด้วย link ทีเดียวได้ทั้ง ssh และ sftp
เราก็จะได้ประหยัดเวลาขึ้นอีกหน่อย :)

วันอังคารที่ 2 กันยายน พ.ศ. 2557

install RFID card reader R502-CL

ต่อไปนี้จะเป็นการติดตั้ง RF-ID smart card reader รุ่น R502-CL ของ Feitian

1. sudo apt-get update

2. Open a root terminal window; you need to have administrator rights.
Get and install the libusb library with the apt-get command: apt-get install libusb-dev libusb++-0.1-4c2 Check the installation: You shall find the library libusb.so under the directory /usr/lib/

3. Download and install the libccid package: apt-get install libccid
4. Download and install the pcsc-lite package: apt-get install pcscd
5. Check that the pcscd service is running:
In the terminal console, run the command ps –A.
You should find a "pcscd" process running in the list displayed
Run pcscd in terminal 

6.Download and install libpcsclite1: apt-get install libpcsclite1

7. Download and install libpcsclite-dev: apt-get install libpcsclite-dev
8. Check whether the R502 reader is detected: your_system_name:/tmp# lsusb
Bus 001 Device 002: ID 096e:0608

9. Use root to run “install script”: $ wget http://download.ftsafe.com/files/reader/product/R502/install.sh $ sh install.sh or $ bash install.sh
10. After run “install script”, then insert reader and start “pcscd” service.
Run “pcsctest” command to do test
Like below: pcscd –adf //run pcscd service, for parameter, you can using “man pcscd” to get more helps pcsctest





จากนั้นให้เสียบ RFIDReader R502-CL เข้ากับ RPi แล้วพิมพ์ pcscd -adf เพื่อทดสอบดูว่าอุปกรณ์เราใช้ได้หรือไม่

จากนั้นให้นำบัตร RFID มาใกล้ๆกับตัวอ่าน จะเห็นภาพดังรูป


 
 
 



วันศุกร์ที่ 29 สิงหาคม พ.ศ. 2557

extract file.tar.bz2

เมื่อเราต้องการ extract file ให้ทำดังนี้
เปิด Terminal แล้วพิมพ์
tar xvjf filename.tar.bz2

 Which will untar it to the current directory. Normally (99% of the time) it will create it's own subdirectory so you don't need to worry about that.
Just so you know:
tar - Tape ARchiver
And the options:
x - extract
v - verbose output (lists all files as they are extracted)
j - deal with bzipped file
f - read from a file, rather than a tape device

"tar --help" will give you more options and info

การมองหารายละเอียดของอุปกรณ์ที่เสียบเขามาใหม่

หลายๆครั้ง ที่เราต้องการทราบรายละเอียดว่าอุปกรณ์ที่เราเพิ่งเสียบเข้ามาทาง usb port เราจะงงว่าทำอย่างไรจึงจะเห็นรายละเอียดเหล่านั้นได้ ซึ่งมีวิธีง่ายๆก็คือ ให้พิมพ์
sudo tail -f /var/log/messages
ใน terminal

จบ....

วันศุกร์ที่ 15 สิงหาคม พ.ศ. 2557

mount flash drive

โดยปกติแล้วที่บอร์ด Raspberry Pi จะมี USB port สำหรับต่อกับ Device ต่างๆ อยู่ 2 port ด้วยกัน หากทั้งสอง Port นี้ว่างอยู่ เราสามารถหาอุปกรณ์อย่างอื่นมาต่อได้ ในตอนนี้ เราจะมาเพิ่มพื้นที่หน่วยความจำให้กับเจ้า Raspberry Pi ด้วยการเพิ่ม USB Flash Drive

ขั้นตอนไม่ยากครับ ง่ายๆ
เพื่อให้มั่นใจว่าระบบมองเห็น USB Flash Drive ที่เสียบเข้ามาจริง เราจะทำการเช็คที่ /var/log/message โดยที่โฟลเดอร์นี้ จะทำการเก็บข้อความ (log message) ระบบที่เกิดขึ้น ซึ่งประกอบไปด้วยข้อความแจ้งว่ามีการส่งเมล์ออกไป, ข้อความแสดงการทำงานของ Cron service , ข้อความของ Kern , ข้อความแสดงการล๊อกอินจาก user อื่นๆ และข้อความแจ้งเตือนว่ามีอุปกรณ์อย่างอื่นพ่วงต่อเข้ามา ซึ่งนั่นเป็นสิ่งที่เรากำลังมองหาอยู่
โดยทั่วไป Linux จะมองเห็น USB Flash Drive เป็น sda1  ที่นี้ เราก็จะมองหา sda1 ที่ /var/log/message โดยใช้คำสั่ง tail เพื่อของดูเนื้อหาตอนท้ายๆ ของไฟล์ message (เนื่องจากไฟล์นี้จะถูกเขียนลงไปเรื่อยๆ ที่บรรทัดสุดท้าย หากมี message จากจุดต่างๆ ของระบบส่งเข้ามา)
ใช้คำสั่ง เพื่อดู message ที่เข้ามาล่าสุดใน /var/log/message ด้วยคำสั่ง
sudo tail -f /var/log/messages



ทำการเสียบเจ้า USB Flash Drive ของเราเข้ากับช่อง USB ของบอร์ด Raspberry Pi สังเกตที่หน้าจอ terminal นี้ จะพบว่า message มีการเปลี่ยนแปลง และถ้า USB Flash Drive เราไม่เสีย จะพบว่า Raspberry Pi มองเห็นเจ้า USB Flash Drive ของเราแล้ว ให้กด Ctrl+C เพื่อหยุดการดู message ได้ครับ
ต่อไปเราจะต้องทำการสร้าง directory เปล่าๆ ขึ้นมา เพื่อทำการ mount ให้เจ้า USB Flash Drive ของเราเข้ากับ Directory นั้น พูดง่ายๆ ก็คือ ทำให้ Directory นั้นกลายเป็น USB Flash Drive นั่นเอง
ใช้คำสั่ง สร้าง directory ที่ชื่อ usbdisk (หรือจะชื่ออื่นๆ ก็ได้นะครับ) ขึ้นมา ในที่นี้ผมจะเก็บไว้ภายใต้โฟลเดอร์ /media นะครับ
sudo mkdir /media/usbdisk
เสร็จแล้ว เราจะทำการ mount hardware คือ เจ้า USB Flash Drive เข้ากับโฟวเดอร์นี้ ด้วยคำสั่ง
sudo mount -t vfat -o uid=pi,gid=pi /dev/sda1 /media/usbdisk/
ตอนนี้ เราจะได้โฟวเดอร์ usbdisk เป็นที่เก็บทุกอย่างเท่าที่ USB Flash Drive มี ลองเข้าไปดูครับ จะเจอไฟล์ที่เราเก็บไว้ที่ USB Flash Drive



เราก็จะได้พื้นที่เพิ่มเติม นอกเหนือจาก SD-Card ที่เรามี แต่เป็นพื้นที่ที่สามารถเคลื่อนย้ายได้ มีอย่างหนึ่งที่ต้องบอกไว้ก็คือ ทุกครั้งที่เราจะทำการ ถอด USB Flash Drive ออกจากบอร์ด Raspberry Pi เราจะต้องทำตรงกันข้ามกับคำสั่ง mount นั่นคือคำสั่ง umount
ก่อนถอด USB Flash Drive เราจะใช้คำสั่ง umount ไปที่ Directory ที่เรา mount ไว้
sudo umount /media/usbdisk



จากนั้น เราจะทำการลบ usbdisk ด้วยก็ได้ หรือจะปล่อยไว้แบบนี้ก็ได้ ครับ ไม่มีปัญหา เพราะเราได้ umount ออกไปแล้ว
เพื่อนๆ อาจจะนำไปประยุกต์ใช้ในการเก็บข้อมูลอีกรูปแบบหนึ่งก็ได้ นอกเหนือจากการเก็บข้อมูลไว้ที่ Database

วันจันทร์ที่ 21 กรกฎาคม พ.ศ. 2557

raspberry pi model B+

สวัสดีครัช ผู้ชื่นชอบ Raspberry Pi

หายไปนาน(อีกแล้ว) งานยุ่งๆบวกกับบ้าออกกำลังกาย ก็เลยไม่ค่อยได้มาเขียนเท่าไหร่

หลังจากปล่อย Raspberry Pi model B ออกมาได้ 2 ปี
ตอนนี้เค้าก็มี Version ใหม่ออกมา ให้เราได้ชื่นชมกันอีก นั่นก็คือ medel b+
ซึ่งก็มี feature ที่เพิ่มขึ้นมากกว่าเก่า เพื่อให้รองรับตามคำเรียกร้องของผู้ใช้งาน
ที่น่ายินดีอีกเรื่องก็คือ "ยังราคาเท่าเดิม" 35$ คูณ 35 ก็ตกราวๆ 1,225 บาท

ใน Model B+ นี้ยังคงใช้ BCM2835 อยู่เหมือนเดิม RAM ก็ยัง 512MB เหมือนเดิม แต่เพิ่มอย่างอื่นขึ้นมาเพียบเลย
1. GPIO มากกว่าเดิม จากเดิม 26 pins เพิ่มเป็น 40 pins
2. USB มากกว่าเดิม จากเดิม 2 ports เพิ่มเป็น 4 ports
3. Micro SD จากเดิมใส่ตามปกติ เปลี่ยนเป็นช่องแบบ push-push คือ กดเพื่อใส่เข้าไป และกดเพื่อให้ออกมาอีกที
4. มีการใช้พลังงานที่น้อยกว่าเดิม โดยเปลี่ยนจาก linear regulator เป็น switching regulator ทำให้ลดพลังงานไปได้ 0.5W - 1W
5. audio ที่ดีกว่าเดิม เพิ่มวงจร low-noise power supply


จากรูปด้านบน จะมีขาที่ชื่อว่า ID_SD และ ID_SC
2 ขานี้ใช้ต่อกับ EEPROM เพื่อ setup gpio ถ้าเราไม่ใช้ EEPROM ก็ห้ามต่อใช้อย่างอื่นนะครัช

ถึงแม้ว่าเขาจะผลิต Model B+ ขึ้นมา เราก็ไม่ต้องกลัวว่าผลงานที่เราทำไปแล้ว จะไม่มีให้ซื้อใช้ เพราะว่าเขายังผลิต Model B อยู่เหมือนเดิมครัช(ถ้ายังมีคนสั่งอยู่)


ที่มา
http://www.raspberrypi.org/introducing-raspberry-pi-model-b-plus/

http://pi.gadgetoid.com/pinout

วันจันทร์ที่ 2 มิถุนายน พ.ศ. 2557

kill process

หายไปนานเลยเรา วันนี้มีเกล็ดเล็กเกร็ดน้อยมาฝากครับ
ถ้าหากเราเปิดโปรแกรมอะไรขึ้นมาสักอย่าง แล้วต้องการหยุดโปรแกรมนั้นๆ เราสามารถใช้คำสั่ง "top" เพื่อดูหมายเลขประจำโปรแกรมนั้นๆ หลังจากที่เราพิมพ์ top ใน command line แล้ว เราจะเห็นรายละเอียดของโปรแกรมต่างๆที่เราเปิดอยู่ในขณะนั้น



ก็ให้เราดูที่ช่องแรก PID คือหมายเลขของโปรแกรมที่เปิดอยู่ ส่วนช่องขวาสุด จะเป็นชื่อของโปรแกรมที่เราเปิด
สมมติว่าเราต้องการปิดโปรแกรม iceweasel ก็ให้เราพิมพ์ "kill 3772" แเค่นี้โปรแกรมก็จะถูกปิดลงครับ

ปล.
ในที่นี้ผมใช้ linux debian ในการแสดงคัวอย่าง แต่ใน linux ทั่วๆไปรวมถึง rpi ก็เป็นแบบเดียวกันครับ

วันอังคารที่ 6 พฤษภาคม พ.ศ. 2557

raspberry pi 7-segment with 74hc595

สวัสดีครับเพื่อนๆทุกท่าน แม้ว่าจะมีไม่มาก :)

ต่อจากบทก่อนหน้านี้  ได้ศึกษากันไปแล้ว ในการใช้ python ควบคุมการทำงานของ LED หลอดเล็กๆ
ในตอนนี้ ผมได้ทำการต่อ raspberry pi เข้ากับ LED บอร์ดใหญ่ที่ใช้ไฟ 12 โวลต์(ซื้อจากฟิวเจอร์คิท)
                                  รูปแผง LED 4 หลัก ใช้ไฟเลี้ยง 12 โวลต์

ซึ่ง Raspberry pi อย่างที่ทราบกันแล้วว่าใช้ไฟแค่ 5 โวลต์ และ gpio มีไฟแค่ 3.3 โวลต์ ก็เลยจำเป็นต้องหา buffer มาคั่นกลาง เพื่อให้สามารถขับ LED แผงนี้ได้
โดยผมใช้ IC เบอร์ 7407 เป็น buffer ดังที่เคยเขียนไปในตอนก่อนหน้านี้แล้ว




 และเพื่อให้สามารถใช้ gpio ที่มีอยู่ได้อย่างพอเพียง จึงได้ใช้ IC เบอร์ 74hc595 ที่ทำให้เราใช้ gpio เพียง 5 ขาในการขับ LED ทั้ง 4 หลักนี้



โดยจากขา gpio ของ raspberry pi ต่อเข้ากับ 74hc595 ตรงๆก่อน แล้วต่อขา output ของ 74hc595(Q0-Q7) ต่อเข้ากับ input ของ 7407 (1A-6A)

แล้วนำ 1Y-6Y ต่อกับ LED ของเรา โดยที่มี r 4.7k pull up ไว้



เมื่อบัดกรีวงจรเสร็จเรียบร้อยแล้ว ก็เป็นอย่างที่เห็นคับ

แล้วผมก็ลองเขียน code โดยใช้ python ดู เพื่อลองขับ LED ก็สามารถใช้งานได้ครับ
โดยเราต้องนำ file ของเรา ไปวางไว้ที่ raspberry pi ก่อน
แล้วทำให้สามารถ run ได้โดยคำสั่ง chmod +x my_file.py
แล้วใช้คำสั่ง python my_file.py เพื่อ run โปรแกรม




ตัวอย่าง code ครับ
#! /usr/bin/python

import RPi.GPIO as GPIO
import time

#Data Pins needed on the RPi
DATAIN=11 #DS
LATCH=13  #STCP
CLOCK=15  #SHCP
CLEAR=22  #MR Low
OE=23     #Output Enable Low

#GPIO definition
def setup():
    GPIO.setmode(GPIO.BOARD)
    GPIO.cleanup()
    GPIO.setup(DATAIN,GPIO.OUT)
    GPIO.setup(CLOCK,GPIO.OUT)
    GPIO.setup(LATCH,GPIO.OUT)
    GPIO.setup(CLEAR,GPIO.OUT)
    GPIO.setup(OE,GPIO.OUT)

    GPIO.output(LATCH,False) #Latch is used to output the saved data
    GPIO.output(CLEAR,True)  #Clear must always be true. False clears registers
    GPIO.output(OE,False)    #Output Enable speaks for itself. Must be False to display
    GPIO.output(CLOCK,False) #Used to shift the value of DATAIN to the register
    GPIO.output(DATAIN,False)#Databit to be shifted into the register
def clean():
    GPIO.output(CLEAR,False)
    GPIO.output(CLEAR,True)
    GPIO.output(LATCH,True)
    GPIO.output(LATCH,False)

setup()
clean()
x=0

while 1:
 if x > 32:
  x=0
  clean()

 GPIO.output(DATAIN,True)
 GPIO.output(CLOCK,True)
 GPIO.output(CLOCK,False)

 GPIO.output(LATCH,True)
 GPIO.output(LATCH,False)
 time.sleep(0.06)
 x = x+1


ผมอาจจะอธิบายไม่ค่อยละเอียดนะครับ ถ้าหากมีข้อสงสัยก็ถามกันได้ ที่ niran@flowco.co.th ครับ

ที่มา
http://www.sysstem.at/2013/09/7-segment-display-with-74hc595-shift-register-and-raspberry-pi/



ตัวอย่างเพิ่มเติม

#! /usr/bin/python

import RPi.GPIO as GPIO
import time

#Data Pins needed on the RPi
DATAIN=11 #DS
LATCH=13  #STCP
CLOCK=15  #SHCP
CLEAR=22  #MR Low
OE=23     #Output Enable Low


#GPIO definition
def setup():
    GPIO.setmode(GPIO.BOARD)
    GPIO.cleanup()
    GPIO.setup(DATAIN,GPIO.OUT)
    GPIO.setup(CLOCK,GPIO.OUT)
    GPIO.setup(LATCH,GPIO.OUT)
    GPIO.setup(CLEAR,GPIO.OUT)
    GPIO.setup(OE,GPIO.OUT)

    GPIO.output(LATCH,False) #Latch is used to output the saved data
    GPIO.output(CLEAR,True)  #Clear must always be true. False clears registers
    GPIO.output(OE,False)    #Output Enable speaks for itself. Must be False to display
    GPIO.output(CLOCK,False) #Used to shift the value of DATAIN to the register
    GPIO.output(DATAIN,False)#Databit to be shifted into the register
#Clean up display
def clean():
    GPIO.output(CLEAR,False)
    GPIO.output(CLEAR,True)
    GPIO.output(LATCH,True)
    GPIO.output(LATCH,False)

#Shift data
def shift(BitOut):
  if BitOut == 1:
       BitOut=True
  else:
       BitOut=False
  GPIO.output(DATAIN,BitOut)
  GPIO.output(CLOCK,True)
  GPIO.output(CLOCK,False)

#Push Data to display
def WriteOut():
  GPIO.output(LATCH,True)
  GPIO.output(LATCH,False)

#write number
def WriteNum(num):
  for i in range(0,8):
    shift((num>>i)%2)

from array import *
number_array = array('i',[0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6])

setup()
clean()
x=0

for i in range(0,9999):
    x = i/1000
    WriteNum(number_array[x])
    x = (i%1000)/100
    WriteNum(number_array[x])
    x = (i%100)/10
    WriteNum(number_array[x])
    x = i%10
    WriteNum(number_array[x])
    WriteOut()   
    time.sleep(1)
    clean()




 

วันจันทร์ที่ 28 เมษายน พ.ศ. 2557

auto run your application

auto run your application


บทความวันนี้จะเกี่ยวกับเรื่อง auto run application
หลังจากที่เราเขียน application ตัวหนึ่งเสร็จแล้ว ขั้นตอนต่อไปก็คงต้องเป็นการตั้งค่าให้ Rpi run application ทันที หลังจากที่ boot เครื่องใหม่ (auto run)

ซึ่งก็ทำได้ไม่ยากครับ ดังนี้



แก้ไข rc.local
sudo nano /etc/rc.local
โดยเพิ่มบรรทัดนี้เข้าไป ในบรรทัดก่อนสุดท้าย (เหนือ exit 0)
sudo python /home/pi/my_project.py

หรือถ้าเป็น application อย่างอื่น ก็ลองแบบนี้ครับ
cd /home/pi/any_folder_u_define
sudo ./your_application

กด CTRL+X, "Y" และ Enter เพื่อออกและ save

ทดสอบด้วยการ reboot แล้วรอดูผลกันครับ :)

ที่มา
http://www.raspberry-projects.com/pi/pi-operating-systems/raspbian/scripts
http://stackoverflow.com/questions/22353134/raspberry-pi-auto-starting-a-program

วันศุกร์ที่ 25 เมษายน พ.ศ. 2557

เตรียมเครื่อง Linux PC ไว้สำหรับเล่น raspberry pi

1. have linux pc (ubuntu11)
2. sudo apt-get update
3. sudo apt-get install build-essential git
4. mkdir rpi in home directory
5. cd rpi
6. sudo git clone git://github.com/raspberrypi/tools.git คำสั่งนี้จะ clone raspbian's official cross compile นานหน่อย
7. cd ~/
8. nano .bashrc
9. insert "export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin" on the last line off file.
10. type source .bashrc for update path.
11. type "arm-linux-gnueabihf-gcc -v" for check it work or not.

12. install java runtime "sudo apt-get install openjdk-7-jre"
14. typically “~/Downloads/”)then type: “tar -xvzf eclipse-cpp-kepler-R-linux-gtk.tar.gz -C ~/
15. now u can use eclipse in "~/eclipse/eclipse &"
16. start new c++ project
17. next,next then In the “Cross compiler prefix” field type: “arm-linux-gnueabihf-”.
18. In the “Cross compiler path” field type the full path to the toolchain: “/home/kong/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/”
19. after adding source code, build all
20. Lets go there via a console window with cd “cd ~/workspace/HelloRPiWorld/Debug/“. Type in “ls -al” the “HelloRPiWorld” Binary file is highlighted in green.
21. in eclipse program, To deploy the binary on the Raspberry Pi, make sure that the RPi board is powered and connected to your network. The next step is click on “Window->Show View->Other”. This will open a show view window. In this window select the “Remote Systems” folder and then select “Remote Systems Details” and press OK
22. If the “Remote Systems Details” shows up in the bottom of the workspace, drag it such that its tab shares  the same region as the project explorer tab
23. Now right click in the “Remote Systems Detail” area and click on “New Connection”. In the “Select Remote System Type” window, select “SSH only” then click “Next”
24. In the “Remote SSH Only System Connection” (Figure 9) type in the IP address of the RPi in the “Host name” field and give the connection a valid name in the “Connection name” field. I typed “Raspberry Pi”.  Then click “Finish”.
25. At this point a second device (Raspberry Pi) shows up in the “Remote Systems Detail” tab (Figure 10). Right click on the Raspberry Pi resource and click connect. You will be prompted to enter the username and password. Make sure that you utilize “username:pi” and “password:raspberry” (if you haven’t changed the default password). You may get a warning windows asking you if you are sure that you want to accept this connection. Affirm that you want to proceed with the connection. At this point you should be connected to your RPi from Eclipse.
26. Right click on the Raspberry Pi resource again  in the “Remote Systems Detail” tab and click on the “Show in Remote Systems View”. This will open a “Remote Systems” tab in the same region of the workspace. In this tab, one can navigate the root file systems of both the Local Linux OS and that of the Raspbian/Raspberry Pi.
27. Locate the HelloWorld Binary file on our local desktop PC and drag it to the home directory on the Raspberry Pi (You could also right click on the binary and click on “Copy” and then right click on the home folder in the Raspberry Pi and click “Paste”. This effectively copies the binary file to the home directory of the Raspberry Pi.
28. Now right click on the SSH terminal icon under the Raspberry Pi icon (Figure 11) in the  “Remote Systems” and select “Launch Terminal” . This should launch a terminal window in the bottom of the Eclipse workspace (Figure 12). This is basically a console / terminal window connected to the Raspberry Pi via SSH.
29. In the terminal window type “ls -al” to confirm that the “HelloWorld” binary indeed got copied into the home directory of the Raspberry Pi’s root file system. Then change the “HelloWorld” binary’s permission to make it executable: “chmod +x HelloWorld

ที่มา
http://www.lab4inf.fh-muenster.de/lab4inf/docs/Embedded-Software/Eclipse_Cross_Development.pdf

วันเสาร์ที่ 19 เมษายน พ.ศ. 2557

blog ดีๆ เกี่ยวกับ Raspberry Pi

http://www.together.in.th/

http://www.makeuseof.com/tag/7-operating-systems-you-can-run-with-raspberry-pi/

http://xmodulo.com/2014/04/lightweight-web-server-raspberry-pi.html

www.intelliadmin.com/index.php/2013/07/sprinkler-system-controlled-by-a-raspberry-pi/

http://www.raspberrypi-spy.co.uk/2014/04/how-to-change-the-command-line-font-size/

http://www.youtube.com/watch?v=OYXXvaypUKQ&feature=share

http://www.raspberrypi-spy.co.uk/2014/04/hdmipi-raspberry-pi-hd-lcd-screen-beta/

http://www.raspberrypthai.com

http://www.davidhunt.ie/blog/

http://www.together.in.th/

วันเสาร์ที่ 12 เมษายน พ.ศ. 2557

Rpi configure wifi

ถ้าต้องการใช้ wifi ให้ทำดังนี้ครับ

ต่อ wifi adaptor เข้ากับบอร์ด Rpi
USB Wifi Dongle with Case (IEEE 802.11g - 54 Mb) Chip Set RT2070 
                                                              ภาพที่ 1

ทำการ remote desktop

เปิด wpa_gui ตามภาพที่ 2

                                                       ภาพที่ 2

กด scan
                                                        ภาพที่ 3

กด scan
                                                      ภาพที่ 4

จะเห็นรายชื่อ wifi network ขึ้นมา ให้ double click ที่รายชื่อที่เราต้องการเชื่อมต่อ
ในช่อง PSK ให้เราใส่ password แล้วกด add

                                                    ภาพที่ 5
กด connect

                                                        ภาพที่ 6

configure เพิ่มนิดหน่อยเพื่อให้ auto connect หลังจาก boot ใหม่ ดังนี้
ที่บอร์ด Rpi
nano /etc/wpa_supplicant/wpa_supplicant.conf
กด ctrl+x เพื่อออกและ save


nano /etc/network/interfaces
กด ctrl+x เพื่อออกและ save

sudo reboot
แล้วใช้ nmap ลองหา ip ของ wireless lan ของ Rpi ดู

ถ้าต้องการให้เป็น static ip
nano /etc/network/interfaces
auto lo

iface lo inet loopback
iface eth0 inet dhcp

#allow-hotplug wlan0
auto wlan0
iface wlan0 inet static
        wireless-essid <myssid>
        address 192.168.0.100
        netmask 255.255.255.0
        gateway 192.168.0.1
        network 192.168.0.0
        broadcast 192.168.0.255
        pre-up wpa_supplicant -B w -D wext -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
        post-down killall -q wpa_supplicant
iface default inet manual

หากต้องการให้เป็น dhcp ให้แก้ไขเป็นดังนี้
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

วันนี่ได้เอา wifi ตัวนี้มาต่อกับ rpi2 แต่ใช้ไม่ได้ พบวิธีแก้ไขดังนี้
sudo apt-get install rpi-update เสร็จแล้ว reboot

ที่มา
https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md
http://www.raspyfi.com/wi-fi-on-raspberry-pi-a-simple-guide/
http://www.suntimebox.com/raspberry-pi-tutorial-course/week-3/day2-1-wireless-network-setup/
http://www.raspberrypi.org/forums/viewtopic.php?t=26795
http://www.raspberrypi.org/forums/viewtopic.php?t=11517
http://www.unzeen.com/article/2598/

ทำ Rpi ให้เป็น static ip

ในบางครั้งเรามีความจำเป็นที่จะต้องทำให้บอร์ดของเราเป็น static ip เพื่อเหตุผลบางประการ
ยกตัวอย่างเช่นเขียนโปรแกรมที่ต้องใช้ ip เดิมๆในการติดต่อ

ให้เราทำการ ssh เข้าไปที่บอร์ด Rpi แล้วพิมพ์

nano /etc/network/interfaces

auto lo
iface lo inet loopback
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.0.6
netmask 255.255.255.0
gateway 192.168.0.1
network 192.168.0.0
broadcast 192.168.0.255

การใส่เครื่องหมาย # เป็นการ comment หรือการไม่นำมารวมอยู่ใน code ของเรา

แค่นี้เองครับ เราก็ได้ Rpi ที่เป็น static ip แล้ว

หรือมีอีกวิธีนึง คือ
เข้าไปที่ sudo nano /etc/dhcpcd.conf
แล้วพิมพ์เพิ่มเติม ที่บรรทัดสุดท้าย ดังนี้

# Custom static IP address for eth0.
interface eth0
static ip_address=192.168.0.200/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

ที่มา
http://sizious.com/2015/08/28/setting-a-static-ip-on-raspberry-pi-on-raspbian-20150505/