Friday, March 10

How to fix static IP on Raspberry pi (jessie)

ในเวอร์ชั่นใหม่ๆ ของ raspberry pi เช่น jessie นั้น เขาย้ายที่สำหรับ fix static ip address จากเดิม เราเคยเข้าไปเซต ที่

sudo nano /etc/network/interfaces เราจะพบข้อความสองบันทัดด้านบน ให้ย้ายไปกำหนดค่า static ip ที่  sudo nano /etc/dhcpcd.conf  ตามรูป

fix static ip address

โอเค งั้นเราไปเซตที่ใหม่กันเหอะ ก็ไปที่

sudo nano /etc/dhcpcd.conf

จะพบข้อความมากมาย ไม่ต้องสนใจ ให้ไปที่บันทัดสุดท้าย แล้วเติมข้อความที่อยากจะ fix static ip address กัน เลย ในทีนี้ ผมต้องการ fix แค่ port ethernet ของมัน ผมก็เพิ่ม

interface eth0
static ip_address=192.168.10.108


บันทึกซะ (สำหรับ nano editor กด Ctrl+X ตอบ Y)  แล้วก็สั่ง reboot ซะ เราจะได้ raspberry pi ที่ fix static ip address แล้วหล่ะ

fix static ip address

อ่านเพิ่มเติม...

Tuesday, March 15

Mysql server has gone away on Raspberry pi

       มีงานอยู่งานหนึ่ง ผมติดตั้ง Mysql Server V5  ลงบนบอรืด Rpi เพื่อที่จะได้เก็บ Record บางอย่าง โดยรอรับค่าจาก python โดยเจ้าสคริปต์ python ผมทำงานแบบ Event driven ถ้ามีเหตุการณ์เกิดขึ้น จะทำการบันทึก ค้นหา ลงฐานข้อมูล Mysql ทีนี้ เจ้าสคริปต์ตัวนี้ จะทำการสร้าง connection ขึ้นมา แต่ในกรณีที่ไม่เกิด Event ใดๆ เลยเป็นเวลา 8 ชั่วโมง เจ้า Mysql Server จะทำการตัด Connect นั้นทิ้งไป แม้ว่า เราจะยัง connect อยู่ก็ตาม (ไม่เกิดการ Query , Insert , Update ใดๆ)  หลังจาก 8 ชั่วโมงผ่านไปแล้ว ถ้าจู่ๆ มี Event เกิดขึ้นที่ python สคริปตฺ์นี้ มันจะทำการอัพเดทข้อมูลลงฐานข้อมูล แต่เนื่องจากว่า Mysql Server ได้ตัดการเชื่อมต่อทิ้งไปแล้ว ก็จะเกิด Exception ที่ชื่อว่า  Error 2006 Mysql Server has gone away นั่นเอง

ทางแก้ไข คือ ให้เข้าไปแก้ไขค่า my.cnf ที่อยู่ใน /etc/mysql/my.cnf โดยเพิ่มหัวข้อ
wait_timeout = 31536000

อ้างอิงจาก http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

my.cnf

MySQL  MySQL 5.0 Reference Manual  5.1

ลองไปแก้ดูนะครับ หากเจอเหตุการณ์เหมือนผม

อ่านเพิ่มเติม...

Sunday, January 3

How to remote desktop connection to X11 raspberry pi

แต่ก่อนไม่ค่อยได้ยุ่งเกี่ยวกับ XWindow ของ RPi เลย หลังๆ มาเริ่มมีงานที่ต้องเขียน GUI แล้วรันบน XWindow ของ RPi ซึ่งก็ต้องวิ่งหาจอ LCD VGA แยกให้มันต่างหาก ทำงานบน windows ต่างหากอีก 1 จอ ถ้าใครมีจอ LCD เหลือใช้ก็ไม่มีปัญหา แต่สำหรับใครทีี่มีอยู่จอเดียว คู่กายแล้วหล่ะก็ลำบากแน่ๆ
ใน WIndows XP, 7 ขึ้นไป จะมีคำสั่งสำหรับเข้าควบคุมเครื่องอื่นในเนตเวิร์กอยู่โปรแกรมหนึ่ง ชื่อ Remote Desktop connection วิธีการเรียกโปรแกรม ก็กดปุ่ม window + R แล้วก็พิมพ์ mstsc ดังรูป

จะปรากฏหน้าต่างขึ้นมาให้ใส่ IP บอร์ดของ RPi ที่เราต่อไว้กับเนตเวิร์กของเรา (IP อาจจะไม่เหมือนผมก็ได้นะครับ แล้วแต่ท่านตั้งค่าไว้ ดูบทความเก่าๆ ได้ว่าตั้งค่าอย่างไร )

แต่ก่อนจะกด Connect นะครับ ให้ทำการติดตั้งโปรแกรมบนบอร์ดของ Rpi ของเราเสียก่อน ทำการ ssh ไปที่บอร์ด Rpi ของเรา แล้วทำการติดตั้งโปรแกรม XRDP server โดยใช้คำสั่ง
sudo apt-get install xrdp
รอสักครู่ เมื่อเรียบร้อยแล้ว ค่อยกลับมากดปุ่ม connect ที่หน้าต่างโปรแกรม Remote Desktop Connection ครับ
จะปรากฏหน้าต่าง ให้กรอก username / password ถ้าไม่ได้เปลี่ยนแปลงอะไร ก็กรอก pi ในช่อง username แล้วก็กรอก raspberry ในช่อง password ครับ จากนั้นกด OK โปรแกรมจะพาท่านเข้า xwindow ของ Raspberry pi ครับ




เป็นอันเรียบร้อยครับ มี xwindow ของ linux ให้ใช้บน window หล่ะ สบาย จะเขียนโปรแกรมอะไร ก็รีโมทเข้าไปใช้ xwindow ผ่านโปรแกรม Remote Desktop Connection ได้เลยครับ
Rock กันเลย……..


อ่านเพิ่มเติม...

Sunday, November 29

How to install Mosquitto MQTT Broker on RPi2

     เกริ่นนำสักนิดหนึ่ง ตั้งแต่ การเข้ามาของ IOT หรือ Internet of Things ที่กำลังอินเทรนกันอยู่ตอนนนี้ ก็ได้มีความพยายามที่จะหา Protocol ที่เหมาะสำหรับการสื่อสารผ่าน network กับอุปกรณ์พวกไมโครคอนโทรลเลอร์ ก็เลยมีการพัฒนาโปรโตคอลขึ้นมา เพื่อให้เหมาะกับอุปกรณ์เล็กๆ ที่ไม่ต้องการ Header ที่มากไปในการสื่อสารทางเนตเวิร์ก เจ้าโปรโตคอลที่ว่าก็คือ MQTT หรือ MQ Telemetry Transport ไม่รู้ว่าแปลว่าไรเหมือนกัน เอาเป็นว่า ผมอธิบายแบบบ้านๆ เลยหล่ะกัน

image

ในการสื่อสารแบบ MQTT นี้ จะต้องมี MQTT Broker ที่ทำหน้าที่รับข้อความโดยมีหัวข้อ Topic จากผู้ส่ง/จำหน่าย จ่ายแจก หรือ publisher แล้วกระจายส่ิงที่ได้รับมานั้นไปให้ subscriber ที่ได้ทำการลงทะเบียนหัวข้อ Topic นั้นแหละ บอกกับ Broker ไว้แล้ว ว่า ถ้า publisher คน/ตัว ใด ส่ง topic นี้มา ให้เอามาให้ฉัน (subscriber)

อ่านเพิ่มเติม เรื่อง MQTT Protocol ที่รวบรวมไว้ครับ

ตรงส่วน Broker นี้แหละ ที่เราจะเอา Raspberry pi มาทำเป็น MQTT Broker ในที่นี้ ผมใช้ RPi2 ที่ติดตั้ง Raspbian Wheezy

การติดตั้ง MQTT Broker บน RPi
- ทำการ อัพเกรดต่างๆ ก่อน นานหน่อยสำหรับคนที่ไม่ค่อยได้อัพเกรดบ่อย

sudo apt-get upgrade


- แล้วก็รันคำสั่งตามนี้เลยครับ ทีละบรรทัด นะ ใจเย็นๆ ดู Error ด้วย ถ้ามันมี
curl -O http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
rm mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo curl -O http://repo.mosquitto.org/debian/mosquitto-wheezy.list
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients

บน Rpi เราจะมีทั้ง Mosquitto ที่เอาไว้จัดการ MQTT protocol โดยจะทำให้ Rpi เรากลายเป็น MQTT broker และนอกจากนั้น เราได้ติดตั้ง  mosquitto-clients ซึ่งจะทำให้เราสามารถสั่งให้ Rpi เราเป็นได้ทั้ง subscriber และ publisher ได้อีกด้วย

อันนี้ เป็นคลิปวีดีโอทดสอบของผม ผมลองกับเจ้า ESP8266 และโปรแกรมต่างๆ บน PC โดยทำการ subscribe หัวข้อ topic ที่ชื่อ hello/world ที่ถูกส่ง publish มาจาก ESP8266 โดยที่ RPi ทำหน้า MQTT Broker จัดการรับส่งข้อความทาง MQTT Protocol นั่นเอง

Raspberry pi MQTT_Broker

Youtube : www.youtube.com/watch?v=RvNBlkpGZwU

เรื่องราวมันค่อนข้างยาวนิดนึง เดี๋ยวไว้หาเวลาว่างๆ มาเล่าต่อ แล้วกัน หรือไม่ก็อ่านจากลิ้งค์ที่แปะไว้ด้านล่างนี้แล้วกันครับ

อ้างอิง :

http://jpmens.net/2013/09/01/installing-mosquitto-on-a-raspberry-pi/
http://www.penninkhof.com/2015/05/linking-the-esp8266-a-raspberry-pi-through-mqtt/

อ่านเพิ่มเติม...

Thursday, November 5

Timezone and NTP server Thailand

เราสามารถตั้งค่า Timezone ให้ Raspberry pi ของเราให้เป็น Timezone สำหรับประเทศไทยได้ ด้วยการแก้ไข config

sudo raspi-config

raspi-config timezone

เลือก Internationalisation Options แล้วเลือก  Change Timezone 

raspi-config timezone

จากนั้นเลือก Asia แล้วกด Enter แล้วเลือก Bangkok  Raspberry pi ก็จะปรับเวลาให้ตรงตามเวลาประเทศไทย

เราสามารถที่จะ config ให้ Raspbery pi ไปอัพเดทเวลาจาก NTP server ของประเทศไทยได้ โดยไปแก้ไขที่

sudo nano /etc/ntp.conf

Thailand NTP server list

ทำการ comment ของเก่า แล้วเพิ่มของใหม่เข้าไป ตามภาพ  ซึ่งมีรายชื่อ NTP server  ดังนี้

server 0.th.pool.ntp.org iburst
server 1.th.pool.ntp.org iburst
server 2.th.pool.ntp.org iburst
server 3.th.pool.ntp.org iburst

ทำการบันทึกไฟล์ ntp.conf  แล้วทำการ restart ntp service ด้วยคำสั่ง

sudo /etc/init.d/ntp restart 


และใช้คำสั่งเช็คดูการทำงานของ ntpd service และประสิทธิภาพการ sync เวลากับ NTP server



sudo ntpq -c lpeer  


และใช้คำสั่ง date เช็คเวลาดูอีกที ว่าตรงหรือยัง



เราสามารถเช็คการทำงานของ ntpd ได้ ด้วยการดูที่ syslog ด้วยการใช้คำสั่ง



tail –f /var/log/syslog  หากเห็นข้อความ  host name not found EAI_NODATA: 0.th.pool.ntp.org ให้ทำการเช็คที่ resole.conf



NTP sync issue



sudo nano /etc/resole.conf



config nameserver



แก้ไข nameserver ให้ถูกต้อง ตามรูป  ก็น่าจะโอเค แหละ ให้ restart ntpd service อีกครั้ง  คราวนี้ เวลาของ Raspberry pi ก็จะเดินตรงกับเวลาประเทศไทยแหละ



วันนี้ จบเพียงเท่านี้ ก่อน

อ่านเพิ่มเติม...

Sunday, October 25

mysql replication on raspberry pi

mysql replication on raspberry pi    Mysql server เป็นฐานข้อมูลที่นิยมใช้กันอย่างแพร่หลาย เพราะ ฟรี และรองรับการเชื่อมต่อที่เยอะๆ ได้อย่างดีเยี่ยม และใน Raspberry pi ของเราเอง ก็สามารถติดตั้ง MySQL server ได้อยู่แล้ว ณ ตอนนี้ หากติดตั้ง เราจะได้ mysql server v 5.5 up 

   เราสามารถใช้บอร์ด raspberry pi ของเราในการเก็บข้อมูลไว้ใน MySQL ได้เลย และสามารถให้ user เข้ามาเรียกดูข้อมูลได้ผ่านทางหน้าเว็บ CGI มา query ข้อมูลออกจากฐานข้อมูล ไปแสดงผลบนหน้าเว็บอีกที หรือใช้ IDE พวก mysqlworkbench , mysqlfront ในการเขียน sql ดึงข้อมูลไปใช้งานอีกทีก็ได้ แต่กระนั้นก็ตาม การที่เราจะปล่อยให้เจ้า raspberry pi ของเรา รองรับจำนวน user ที่ต้องเรียกดูข้อมูล โดยที่จำนวน user มีจำนวนการเชื่อมต่อที่เพิ่มมากขึ้น จำนวนครั้งในการเรียกดูมากขึ้น แล้วมาดึงข้อมูลจากบอร์ด raspberry pi ตรงๆ อาจจะไม่ค่อยจะดีเท่าไหร่นัก แลดูจะเกินประสิทธิภาพของบอร์ดไปสักหน่อย แต่ ถ้าเราจะเก็บไว้ดูคนเดียวก็ไม่เป็นไร

   หากเราต้องการที่จะทำการสำรอง หรือต้องการให้ user ทำการเรียกค้นข้อมูลจากฐานข้อมูลแม่ข่ายเครื่องอื่นหล่ะ โดยข้อมูลที่เรียกดู ก็เหมือนข้อมูลที่อยู่ใน raspberry pi หล่ะ เราจะทำอย่างไร

    ใน mysql มีวิธีการหนึ่งที่เรียกว่า replication คือ การที่เครื่อง slave server มีข้อมูลเหมือนกับ master server และเมื่อ master server มีการเปลียนแปลงข้อมูลภายใน field ข้อมูลนั้นจะถูกอัพเดทไปที่ slave server ทันที โดยที่เราไม่ต้องเขียน script crond job เพื่ออัพเดทข้อมูลในฐานข้อมูลเลย ดังนั้น จึงมั่นใจได้ว่า ข้อมูลทั้ง สองแม่ข่าย ระหว่าง  master server และ slave server จะเหมือนกันแป๊ะ และนอกจากนั้น เรายังสามารถเพิ่มจำนวน slave server ได้อีกด้วย ข้อมูลไม่สูญหายแน่ๆ หากเกิดความดผิดพลาดกับ master server หรือ slave server บางตัว

   ในทีนี้ ผมจะทดลองใน local network ก่อน โดยที่ Raspberry pi ของผม มี IP เป็น 192.168.2.109 โดยเราจะให้เป็น master server ส่วน PC ของผมจะให้เป็น Slave server ซึ่งเป็น IP 192.168.2.101 โดยทั้งคู่ได้ติดตั้ง mysql server ไว้อยู่แล้ว เป็นเวอร์ชั่น 5.5 ขึ้นไป 

ขั้นตอนแรก ให้เราทำการ config /etc/mysql/my.cnf ที่อยู่บน raspberry pi ก่อน

sudo /etc/init.d/mysql stop   หยุดการทำงานของ mysql ก่อน

sudo nano /etc/mysql/my.cnf  

จากนั้นมองหา [mysqld] แล้วเพิ่มค่าเข้าไป

log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1

ทำการบันทึกไฟล์ แล้วสั่งให้ mysql ทำงาน หากไม่มีอะไรผิดพลาด เราน่าจะสั่ง start service mysql ได้

sudo /etc/init.d/mysql start

จากนั้น เราจะทำการเพ่ิม user สำหรับให้ slave เป็น user account สำหรับเข้ามา replicate ข้อมูลจาก master โดยการเพิ่ม user ดังนี้  ยังอยู่ที่ raspberry pi อยู่นะครับ  พิมพ์คำสั่งที่ console

mysql –uroot –p  แล้วกด enter ถ้ามันถามหา password ก็ใส่ password ไป สำใครที่ตั้ง password  เมื่อเข้าไปแล้ว  prompt เราจะกลายเป็น mysql>  ให้เราสร้าง user ด้วยคำสั่ง sql ต่อไปนี้

mysql>CREATE USER 'repl'@'192.168.2.101' IDENTIFIED BY 'merlin';

mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.2.101';

เรากำลังเพิ่มให้มี user ชื่อ repl โดยสามารถเชื่อมต่อมาจาก ip 192.168.2.101 เท่านั้น ซึ่งก็คือเครื่อง slave ของเรา กำหนดให้ password คือ merlin

ต่อมา ให้สร้างจุด Check Point เพื่อให้เป็นจุดเริ่มต้นสำหรับการ Replicate โดยใช้คำสั่ง sql

mysql>FLUSH TABLES WITH READ LOCK;
mysql>SHOW MASTER STATUS;
mysql>UNLOCK TABLES;

mysql replication on raspberry pi

ค่า   mysql-bin.000003 และ 2717  ให้จดจำค่านี้ไว้ ไปกำหนด ที่ฝั่ง slave

อันดับต่อไป เราจะมา config ค่าที่เครื่อง slave กันบ้าาง โดยที่เครื่อง slave ของผมนี้ เป็น windows 7 ที่ติดตั้ง xampp ไว้อยู่แล้ว ซึ่งใน xampp จะมี mysql server มาให้อยู่แล้ว การกำหนดค่า config สำหรับบน windows นั้น จะอยู่ที่ไฟล์ my.ini ซึ่งจะแตกต่างออกไปจากของ linux 

ทำการหยุด service ของ mysql ก่อน ถ้าเป็น xampp เราก็กดปุ่ม stop ได้เลย ดังภาพ แล้วทำการเปิดไฟล์ my.ini

mysql replication on raspberry pi

มองหา [mysqld] แล้วทำการเพิ่ม หรือ uncomment หากมันมีอยู่แล้ว ให้ได้ตามนี้ ครับ

server-id=2 อาจจะต้อง comment บรรทัดที่มันเขียนว่า server-id=1 ถ้ามันมีอยู่  บันทึก และทำการ start service mysql ขึ้นมา หากไม่มีอะไรผิดพลาด เราน่าจะ start mysql service ได้

เพื่อนๆ อาจจะใช้ mysqlfron เพื่อเชื่อมต่อกับ mysql ที่เครื่อง slave เพื่อรันคำสั่ง sql ต่อไปนี้

mysql>CHANGE MASTER TO

  MASTER_HOST='192.168.2.109',

  MASTER_USER='repl',

  MASTER_PASSWORD='merlin',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='mysql-bin.000003',

  MASTER_LOG_POS=2717,

  MASTER_CONNECT_RETRY=10;

จะเห็นว่า เราต้องเอาค่า mysql-bin แล้ว position จากข้อที่แล้ว มากำหนดในการสั่งให้ slave มองไปที่ master ตรงตำแหน่ง checkpoint ที่ได้

จากนั้น เริ่มทำการ replicate ด้วยคำสั่ง sql ดังนีั้

mysql>start slave;

mysql>show slave status;

ทดสอบแล้วเปลี่ยนแปลงข้อมูลภาพใน field ใน table ใดก็ได้ ใน master ซึ่งก็คือ Raspberry pi ของเรา และสังเกตผลลัพธ์ที่เกิดขึ้นที่ slave ซึ่งก็คือ pc ของเรา จะพบว่า ข้อมูลจะเปลี่ยนแปลงตาม master ทันที โดยที่เราไม่ต้องมานั่งกังวลกับการเขียน script crond job เพื่อทำการอัพเดทขู้อมูล หรือทำการ backup เลย และก็ไม่ต้องกังวลว่า จะต้องเปิดเครื่อง slave ไว้ตลอดหรือเปล่า เราอาาจะปิดเครื่อง slave ไปก็ได้ และเมื่อเปิดเครื่อง slave มา มันก็จะทำการเช็คว่า master มีอะไรเปลี่ยนแปลงไปจากล่าสุดที่มันเคยเช็คหรือเปล่า  ถ้ามี มันก็จะทำการ replicate ให้ทันที 

ประโยชน์ที่คิดว่าจะได้รับ ก็ตามนี้

The target uses for replication in MySQL include:

 

   Scale-out solutions - spreading the load among multiple slaves to improve performance. In this environment, all writes and updates must take place on the master server. Reads, however, may take place on one or more slaves. This model can improve the performance of writes (since the master is dedicated to updates), while dramatically increasing read speed across an increasing number of slaves.

 

   Data security - because data is replicated to the slave, and the slave can pause the replication process, it is possible to run backup services on the slave without corrupting the corresponding master data.

 

   Analytics - live data can be created on the master, while the analysis of the information can take place on the slave without affecting the performance of the master.

 

   Long-distance data distribution - if a branch office would like to work with a copy of your main data, you can use replication to create a local copy of the data for their use without requiring permanent access to the master.

อ้างอิง :

http://dev.mysql.com/doc/refman/5.0/en/replication.html

http://www.wandee.org/wordpress/?p=158

อ่านเพิ่มเติม...

Friday, June 5

How to connect mysql-server (config my.cnf)

       ใน Mysq-server ที่ติดตั้งบน Raspbian ตัวล่าสุดจะเป็น mysql server เวอร์ชั่น Server version: 5.5.43-0+deb7u1 (Debian) ซึ่งจะไม่รองรับวิธีการเชื่อมต่อแบบ HTTP Tunnel แบบเก่าของเราซะแล้ว แต่ก็ยังมีทางอื่นอยู่ โดยเราจะกลับมาเชื่อมต่อผ่าน PORT 3306 เหมือนเดิม แต่ โดยปกติแล้ว จะรีโมทจากภายนอกเข้ามาทาง Port 3306 ของ Raspberry pi ไม่ได้ ต้องทำการแก้ไขไฟล my.cnf ซะก่อน

ทำการแก้ไขไฟล์ my.cnf (โปรดกระทำด้วยความระมัดระวัง) 

sudo nano /etc/mysql/my.cnf

มองหาบรรทัดที่เขียนว่า “bind-address”  ปกติมันจะมีค่าเป็น 127.0.0.1 หรือไม่ก็ localhost ให้ทำการแก้ไขเป็น IP address ของ Raspberry pi ในที่นี้ เราได้ทำการ Fix IP address ของ Raspberry pi เป็น 192.168.2.107 (วิธีการ Fix IP address) 

 sudo nano /etc/mysql/my.cnf
บันทึกไฟล์กด Ctrl+X แล้วตอบ Y  จากนั้นให้ทำการ restart service mysql

sudo service mysql restart

sudo service mysql restart

กลับมาที่เครื่องเรา ให้เปิดโปรแกรมที่จะทำการเชื่อมต่อกับ Mysql server บน Raspberry pi ในทีนี้ผมจะลองใช้ MySQL Workbench หลังจากติดตั้งแล้ว ให้ไปที่เมนู Database –> Connect Database แล้วตั้งค่าดังรูป อย่าลืมก่อน connect ให้เพิ่ม root@’%’ บน Mysql server ก่อนนะ

MySQL workbench connect MySQL server raspberry pi

หรือจะกลับมาตั้งค่าบน Mysql-front ก็ทำได้เช่นเดียวกัน เพราะ เราได้ไปแก้ไขบนไฟล์ my.cnf เรียบร้อยแล้ว

Mysql-front connect MySQL server raspberry pi

อ่านเพิ่มเติม...

How to format micro sd-card for raspbian OS

            เมื่อเร็วๆนี้ ผมเจอว่า เจ้า Rasbian OS มันพัง จึงจำเป็นต้องทำการ Write image file เจ้า raspbian ใหม่ ในตอนแรก ก็ดันจำไม่ได้ซะด้วย ว่าลงโปรแกรมยังงงัย ก็ทำการถอด micro sd-card มาทำการ format ก็แปลกใจ เอ๊ะ ทำไม มันเห็นแค่ 55.6MB แต่ ก็ช่างมันเหอะ ไม่น่าจะเป็นอะไร ก็เลย จัดการเตรียมตัวที่จะ write image file ด้วยโปรแกรม Win32DiskImage ปรากฏว่า มันไม่ยอม มันฟ้อง Not enough space on  disk  เอาหล่ะสิ micro sd-card เสียหรือเปล่า ก็ลองหลายวิธี ก็ไม่สามารถติดตั้งได้

Micro sd-card not enough space on disk when write raspbian image file

    ปรึกษาเพื่อนสมาชิกใน Facebook แนะนำให้ลองโปรแกรม DiskPart ที่ติดอยู่กับ Windows 7  เฮ้ย มันใช้ได้เลย  ดีใจมาก เพราะนั่งเครียด ลองแล้วลองอีก ตั้งหลายวิธี ค้นหาใน Google ก็ไม่เจอวิธีที่มันโดนสักที วิํธีแก้ไข ก็ตามรูปเลย เปิด Command line ขึ้นมา แล้วก็พิมพ์คำว่า  Diskpart (ตัวเล็ก ตัวใหญ่ได้หมด)

list disk เพื่อค้นหาว่ามี disk อยู่กี่อันบนคอมพิวเตอร์

select disk=1 ทำการเลือก disk 1 ซึ่งเรามองดูแล้ว น่าจะเป็น micro sd-card เรานั่นแหละ ตรงนี้ ให้ระวัง อย่าเลือกผิด เดี๋ยวพลาดไปเลือกโดนฮาร์ดดิสก์หลัก แล้ว งานจะเข้า

list partition ทำการสั่งให้แสดง partition บน disk 1

ถ้ามี partition อยู่ก็ให้ clean ซะ

list partition อีกที ดูสิ หายไปไหม ถ้าหายไปแล้ว ก็ exit ออกไปได้เลย ไม่ต้องทำอะไรต่อ

กลับมาที่ Win32 Disk Image อีกที ลองทำการ Write Raspbian image อีกที่ สังเกตดูว่า ความเร็วในการ Write ไม่น่าจะเร็วมากนัก มันจะค่อยๆ ไป ช้าๆ น่าจะใช้ได้แล้วหล่ะ

แล้วก็ config raspbian อย่างรวดเร็วเหมือนตอนที่แล้ว ก็น่าจะโอเค แล้วหล่ะ

diskpart  clean partition on micro sd-card before write raspbian image file

อ่านเพิ่มเติม...

Sunday, May 24

Python Tips: Smart finding package from Error message

ตามนั้น (คลิกดูรูปใหญ่)

image

สติมา ปัญญาเกิด

อ่านเพิ่มเติม...

How to install raspian on RPi2 (Very fast guide)

ไม่พูดพร่ำทำเพลง มาถึงก็ลุยกันเลย


1 โหลดไฟล์ raspbian image file มาแล้ว ทำการ write ลง micro sd-card
2 เข้าไปแก้ไขไฟล์ cmdline.txt โดยเพิ่ม ip=192.168.2.105 เข้าไปที่ท้าย ระวังเรื่องอัขระแปลกๆ อย่าให้ปนเข้าไปด้วย เปิดดูใน notepad++ ให้แสดงอัขระทั้งหมด ถึงจะเห็น แล้วบันทึกไฟล์
3.นำ micro sd-card เสียบเข้าไปที่บอร์ด RPi2 เสียบสาย LAN เข้ากับ Router จ่ายไฟเข้าไป ปล่อยไว้สักพัก เราจะสามารถรีโมทผ่าน SSH ได้ โดย RPi จะมีค่า IP จากข้อ 2 (ต้องมั่นใจว่าไม่มีเครื่อง PC เครื่องไหนจอง IP นี้)
4 ทำการตั้งค่า raspi-config ตามใจชอบ
5 ทำการแก้ไขไฟล์ cmdline.txt กลับคืน โดยลบค่าจากข้อ 2 ทิ้ง  sudo nano /boot/cmdline.txt
6 ทำการตั้งค่า fix ip โดยแก้ไขที่ sudo nano /etc/network/interface

auto lo

iface lo inet loopback
iface eth0 inet static
address 192.168.2.105
netmask 255.255.255.0
gateway 192.168.2.1

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

7 ทำการแก้ไข เพิ่ม nameserver sudo nano /etc/resolve.conf
nameserver 192.168.2.1
nameserver 8.8.8.8
nameserver 8.8.4.4

รีสตาร์ท เป็นอันเสร็จเรียบร้อย ถ้าทุกอย่างตั้งค่าถูก เราจะสามารถทำ  sudo apt-get update ได้ โดยไม่ฟ้องอะไรที่ error เกี่ยวกับการติดต่อกับ server package ภายนอก

                                         http://raspberry-pi-th.blogspot.com/

อ่านเพิ่มเติม...

How to install DS3231 RTC high precision on Raspberry pi 2

ในบางงาน เราไม่สามารถให้ RPi ของเราเชื่อมต่อกับอินเตอร์เนตได้ แม้ว่า RPi จะต่ออยู่กับ local network ก็ตาม ดังนั้น นาฬิกาของ RPi อาจจะเดินไม่ตรงได้ เพราะ Rpi ใช้หลักการ crontab เพื่อทำการอัพเดทเวลาตนเองเป็นรายคาบ ดังนั้น หากให้เวลาเดินตรงๆ เราก็ต้องหา Hardware จริงๆ มาต่อ เพื่อสร้างฐานเวลาให้กับ RPi ในทีนี้ ผมได้เลือกใช้ DS3231 RTC High precision (เขาว่างั้นนะ)  มาทำเป็นฐานเวลาให้ RPi

ต่อวงจรตามรูป

Raspberry pi 2 with DS3231 RTC high precision

ที่ Raspberry pi หลังจากบูตมาแล้ว ให้ทำการ Enable I2C ด้วยคำสั่ง

#sudo raspi-config

ภายใต้เมนู Advace options จะมีให้เลือก Enable I2C ถามอะไรมา OK ให้หมด ไม่ต้องคิดมาก

เข้าไปเช็คที่ไฟล์ /boot/config.txt จะมีข้อความ อยู่บรรทัดสุดท้าย

dtparam=i2c_arm = on ปรากฏอยู่ ถ้าไม่มีก็เพิ่มซะ จะรออะไรหล่ะ

ทำการ #sudo reboot ซะ 1 ครั้ง

เสร็จแล้วเราก็จะมาบอกให้ Linux รู้จัก device ใหม่ ที่ address 0x68 บน I2C ด้วยคำสั่ง

#sudo modprobe i2c-bcm2708
#echo ds3231 0x68 > sudo tee /sys/class/i2c-adapter/i2c-1/new_device

ถ้า Enter คำสั่งนี้แล้วไม่มีข้อความแจ้ง Error แสดงว่าพิมพ์ถูกแหละ
ใช้คำสั่ง
#sudo hwclock  มันจะไปอ่านค่าเวลาจาก hardware ของเราในทีนี้ ก็คือ ds3231 นั่นแหละ จะนานหน่อย เวลาอ่านค่าเวลาจากมัน


แล้วเราก็เอาคำสั่งนี้แหละไปเพิ่มในไฟล์ /etc/rc.local เอาไว้ตอนที่มันบูทขึ้นมา จะได้จำได้ตลอด

#sudo nano /etc/rc.local

ให้เพิ่มข้อความนี้ ไว้ก่อน Exit 0

echo ds3231 0x68 > sudo tee /sys/class/i2c-adapter/i2c-1/new_device
sudo hwclock -s
Exit 0 <<< จะต้องอยู่ล่างสุด

หากเวลาเดินไม่ตรง เราสามารถใช้คำสั่ง

#sudo hwclock --set --date="2015-05-24 13:00:00"

ตั้งเวลาได้ แต่ ถ้าต่ออินเตอร์เนตอยู่ เราสามารถให้มัน sync กับ NTP server ก่อนได้ ด้วยคำสั่ง
#sudo ntpd -gq  ใช้เวลานิดหนึ่ง มันจะปรับเวลา ds3231 ให้ตรงกับ Timezone ของเรา
แล้วก็ write ค่าลง ds3231 ซะด้วยคำสั่ง
#sudo hwclock -w  ทันที

ขั้นตอนสุดท้าย เราต้องไป disable fake-hwclock เพื่อบอก RPi ว่า ตอนนี้เรามี Hardware ที่เป็น Clock จริงๆ แล้วนะ ไม่ต้องมาหลอกตัวเองอีกแล้ว ด้วยคำสั่ง

#sudo update-rc.d fake-hwclock disable
#sudo update-rc.d ntp disable

บันทึกเพิ่ม
ทำการติดตั้ง i2c-tools เอาไว้เช็คแอดแดรสของอุปกรณ์ที่ต่ออยู่กับ I2C
#sudo apt-get install i2c-tools

เราจะเรียกใช้คำสั่ง
#sudo i2cdetec -y 1 (1 สำหรับ RPi 2 )

ได้ ก็เห็น address ที่อยู่บน I2C bus ถ้าไม่แสดง ให้ทำการเช็คอุปกรณ์ที่ต่ออยู๋ ว่าไม่ได้เสีย หรือลืมจ่ายไฟเลี้ยง

ทำแล้วไม่เวิร์ก ลอง upgrade distro ดูครับ ผมก็ทำไม่เวิร์กเหมือนกันตอนแรก หลังจาก upgrade แล้วได้เลย

#sudo apt-get dist-upgrade

Raspberry pi 2 with DS3231 RTC high precision

 

ที่มา :
http://bohdan-danishevsky.blogspot.com/2014/12/installing-hardware-rtc-ds3132-to.html
http://www.drewkeller.com/blog/adding-hardware-clock-raspberry-pi-ds3231
http://www.bashpi.org/?page_id=500
https://learn.adafruit.com/adding-a-real-time-clock-to-raspberry-pi?view=all
http://decuser.blogspot.com/2015/02/raspberry-pi-b-i2c-and-ds3231-rtc.html

อ่านเพิ่มเติม...

Friday, November 21

how to use php commnad “shell_exec” as root in RPi

วันนี้ นำเสนอเทคนิคเล็กน้อย สำหรับการเรียกใช้คำสั่ง root ผ่านหน้าเว็บแอพลิเคชั่น อย่างเช่น php บน RPi

ตัวอย่างปัญหา คือ ผมต้องการตั้งค่า วันเวลา บน Rpi

เช่น ผมต้องการให้มีการแก้ไข เวลาของ RPi  แล้ว ปกติ เราสามารถเรียกใช้คำสั่ง

sudo date --set="15 NOV 2014 12:43:10"   โดยพิมพ์ไปที่ terminal ของ Rpi ได้  แต่ ถ้าเราต้องการทำ web application ให้สามารถแก้ไขเวลาของ RPi หล่ะ เราจะทำอย่างไร

โดยปกติแล้ว php จะสามารถรัน shell_exec แล้วตามด้วย linux command ได้ เช่น

<?php

$output = shell_exec(“ls –l”);

echo “<pre>$output</pre>

?>

หากเราเรียกเว็บเพจที่มี สคริปต์ตัวอย่างด้านบน เราก็จะเห็นรายละเอียดไฟล์ในโฟวเดอร์ใน linux นั้น แต่ ถ้าเราต้องการให้ shell_exec เรียกคำสั่งที่เป็นของ root ได้หล่ะ เช่น

shell_exec(‘sudo date --set="15 NOV 2014 12:43:10"’);  แบบนี้ เราจะทำไม่ได้ เพราะ ตัวเว็บเพจนี้ ไม่มีสิทธิ์ทำเช่นนั้นได้ วิธีแก้ไข ก็คือ เราต้องไปกำหนดสิทธิ์ให้เว็บ application นี้ก่อน ทำตามนี้

หากเราต้องการให้เรียกใช้คำสั่ง shell_exec ของ PHP  ใน RPi ให้สามารถเรียกใช้คำสั่ง root ได้ เราจำเป็นต้องแก้ไขสิทธิ ของ application ที่ต้องใช้งานสักหน่อย

พิมพ์  sudo visudo

ทำการเพิ่ม  www-data  ALL=(ALL)  NOPASSWD:ALL  ไปที่ท้ายไฟล์ แล้วทำการบันทึกไฟล์นี้

sudo visudo

จากนั้นเขียนสคริปต์ไฟล์ php แล้วไปวางไว้ที่ /var/www 

<?php

$output = shell_exec(‘sudo date --set="15 NOV 2014 12:43:10"’);

echo “<pre>$output</pre>”;

?>

บันทึกโค๊ดนี้ ตั้งชื่อไฟล์ตามใจชอบ เช่น time.php  เสร็จแล้ว ลองเปิดหน้าเว็บบราวเซอร์ แล้ว เรียกไปที่ time.php โดยใส่ ip ของ RPi เช่น  http://192.168.1.103/time.php  เราก็จะสามารถตั้งค่าเวลาของ RPi ผ่านหน้าเว็บได้  ซึ่งโดยปกติ จะไม่สามารถเรียกใช้คำสั่ง sudo ผ่าน shell_exec ได้ 

ลองเอาไปประยุกต์กันดูนะครับ

ปล. บทความนี้ ไม่อาจเขียนละเอียดมากนัก ผู้ที่ไม่มีพื้นฐานเลย อาจจะงง สักเล็กน้อย ขออภัยไว้ ณ ทีนี้ด้วย

อ่านเพิ่มเติม...

Sunday, March 2

shell script check cpu raspberry pi ‘s temperature

vcgencmd measure_temp

หน้าร้อนใกล้เข้าแล้ว  เริ่มเป็นห่วงว่า Raspberry pi จะร้อนเกินไปหรือเปล่า ก็ลองใช้ shell script เช็คอุณหภูมิของ CPU ของ Raspberry pi สักหน่อย ว่า ตอนนี้อุณหภูมิ อยู่ที่เท่าไหร่แล้ว ใช้คำสั่งง่ายๆ ครับ vcgencmd measure_temp แค่ นี้ ก็จะได้คำตอบแล้ว ว่าอุณหภูมิเท่าไหร่  ถ้าจะให้วนลูปเรื่อยๆ ก็ได้ครับ

while true; do vcgencmd measure_temp; sleep 2; done

วนลูป แล้ว หยุด ทุกๆ 2 วินาที  ลองเอาไปประยุกต์กันดูครับ

อ่านเพิ่มเติม...

Thursday, January 23

Port Forwarding for Raspberry pi from outside world

เผื่อบางท่านที่ยังไม่ทราบ หรือกำลังหาวิธีทำ Port Forwarding จาก Router ไปหา Access point แล้วไปที่บอร์ด Raspberry pi โดยเราจะทำการ Port Forwarding หมายเลขพอร์ท 80 สำหรับเว็บ , หมายเลข 22 สำหรับทำ SSH รีโมทเข้าบอร์ด , หรือพอร์ทอื่นๆ ที่คุณต้องการรันแอพพลิเคชั่น

อันดับแรกเลย ผมจะบอกถึงอุปกรณ์เนตเวิร์กของผมก่อน ผมใช้บริการอินเตอร์เนต จาก 3BB network  ผมมี Huawei router จาก 3BB จากนั้นผมก็ต่อเข้ากับ Enginius ที่เป็นตัวขยาย Port Network และเป็นตัวปล่อยสัญญาณ wifi ภายในบ้าน จากนั้น ผมก็ต่อบอร์ด Raspberry pi เข้ากับ Engenius อีกครั้ง ตามรูป

จากนั้น เราต้องทำการ Fixed หมายเลข IP Address ของที่ Huawei ที่เป็น LAN และที่ Engenius ทั้ง WAN และ LAN เลย ส่วนที่บอร์ด Raspberry pi ก็ให้ Fixed ไว้ด้วยเช่นกัน

Port Forwarding for Raspberry pi from outside world

ทำการ Fixed IP Address ให้ได้ตามรูปด้านบนก่อน 

สำหรับ Huawei

Port Forwarding for Raspberry pi from outside world

 

สำหรับ Engenius 

Port Forwarding for Raspberry pi from outside world

Port Forwarding for Raspberry pi from outside world

จากรูปด้านบน เรามองว่า WAN ของ Huawei คือรับ IP และข้อมูลจากภายนอก แล้ว LAN คือ iP ในวงแลนของเรา แต่ เมื่อเราต่อ Engenius ต่อท้าย Huawei แล้ว จึงทำให้ WAN ของ Engenuis ก็รับข้อมูลจาก LAN ของ Huawei อีกที

ดังนั้น เราต้องทำการบอกที่ Huawei ให้ทำการส่งข้อมูล ที่ต้องการติดต่อกับพอร์ตใดๆ ไว้ที่ Huawei ให้ทำการส่งข้อมูลนั้น ต่อมาที่ WAN IP ของ Engenius  โดยเข้าไปตั้งค่า NAT ในหน้าเว็บของ HUAWEI โดยปกติจะเป็น http://192.168.1.1 แล้วไปที่เมนู Basic->NAT ทำการเพิ่ม Virtual Server ตามรูป ในที่นี้ผมต้องการให้ มีการ Forward port 80,22,8090,900 ไปที่ WAN IP ของ Engenius

Port Forwarding for Raspberry pi from outside world

จากนั้น เราก็ไปตั้งค่า Forwarding Port ที่ Engenius ต่อไปที่บอร์ด Rasbperry pi ของเราอีกที โดยที่บอร์ด Rasbperry pi ของเราถูก Fixed IP Address ไว้ที่ 192.168.2.105

Port Forwarding for Raspberry pi from outside world

ทำการ Fixed IP Address ของบอร์ด Raspberry pi ด้วยการแก้ไขไฟล์ interfaces

nano /etc/network/interfaces

Port Forwarding for Raspberry pi from outside world

แค่นี้ ก็เป็นอันเรียบร้อยแล้ว วิธีทดสอบก็คือ ลอง Connect ผ่าน WAN IP Address ของ Huawei ผ่านหน้าเว็บ (ถ้าเปิด Web service ไว้) หรือผ่าน SSH Terminal จากข้างนอกเข้ามา ซึ่งการหา WAN IP Address ก็ทำตามขั้นตอนจากตอนเก่าๆ ได้ ที่นี่

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

ปล. สำหรับใครที่ใช้ 3BB แล้ว Forward Port ไม่สำเร็จ โทรไปปรึกษา 3BB ที่เบอร์ 1530 นะครับ เพราะบางที เราอาจจะโดนบล๊อกจาก 3BB อยู่ก่อน บอกให้เขาปล๊อดบล๊อกให้ครับ

อ่านเพิ่มเติม...

Wednesday, January 22

Raspberry Pi 1- Wire Digital Thermometer Sensor

    สวัสดีครับ ไม่ได้อัพเดทซะนาน มัวแต่ไปเล่นไมโครคอนโทรลเลอร์อยู่ ต้องกลับมารื้อฟื้นปัดฝุ่น Raspberry pi สักหน่อย ทิ้งช่วงไปนาน เริ่มจะลืมแหละ และก็ไม่รู้ตอนนี้โลก Linux Embedded เขาไปถึงไหนกันแล้ว บอร์ด Linux Embedded กำลังทยอยออกมาอย่างต่อเนื่อง ถ้าไม่กลับมาเล่น Linux Embedded มีหวังตามไม่ทันแน่ๆ

     ช่วงนี้่อากาศก็ยังหนาวอย่างต่อเนื่อง ดึกๆ ยิ่งอากาศเย็น ระวังเรื่องสุขภาพกันด้วย พอพูดถึงเรื่องอากาศเย็น เราก็อยากจะรู้เหมือนกัน ตอนนี้มันเย็นกี่องศาแล้ว งั้นเราก็มาลองให้ Raspberry pi อ่านค่าอุณหภูมิผ่านไอซีดิจิตอล เบอร์ DS18B20 ผ่าน Protocol แบบ 1-wire ดูสักหน่อยสิ ว่าอุณหภูมิตอนนี้มันเท่าไหร่

เนื่องจากไม่ได้อัพเดทเฟิร์มแวร์ของ Raspbian นานแล้ว ก็เอาสักหน่อย ทั้ง update และ upgrade กันไปเลย

sudo apt-get update
sudo apt-get upgrate

ไอ้ตอน upgrade นี่นานเลยหล่ะ ถ้าใครไม่เคยอัพเกรดนานๆ เหมือนผม

เสร็จแล้ว ก็หาไอซีดิจิตอล DS18B20 สักตัว ไม่แพงแล้วทุกวันนี้ ถูกมาก แล้วก็ตัวต้านทาน ค่า 4.7k โอห์ม เอามา Pull-up ขา Data ของไอซี DS18B20 (ตามคำแนะนำดาต้าชีท)

Raspberry Pi 1- Wire Digital Thermometer Sensor

ที่มารูปวงจร http://www.raspberrypi-spy.co.uk/

เมื่อต่อวงจรเสร็จแล้ว ก็ต้องมาทำการเพิ่มโมดูล 1-wire ไปที่ kernel ของ Linux ด้วยคำสั่ง

sudo modprobe w1-gpio
sudo modprobe w1_therm

ถ้าสำเร็จเราจะเห็นข้อมูลการรายงานค่าอุณหภูมิที่ directory /sys/bus/w1/devices ลองเข้าไปที่ directory นี้ดูครับ

cd /sys/bus/w1/devices
ls

ถ้าปรากฏ serial number ของเซ็นเซอร์ คล้ายๆ แบบนี้ก็ใช้ได้ครับ
28-0000031280c7  w1_bus_master1

ให้เราเข้าไปที่ 28-0000031280c7 แล้วอ่านไฟล์ w1_slave ที่อยู่ข้างในดูครับ
cd 28-0000031280c7
ls
cat w1_slave

มันจะรายงานค่าอุณหภูมิที่อ่านได้จากเซ็นเซอร์ DS18B20 มีหน่วยเป็นเซลเซียส


58 01 1e 00 1f ff 08 10 d9 : crc=d9 YES
58 01 1e 00 1f ff 08 10 d9 t=21500

มีค่าประมาณ 21.5 องศาเซลเซียส  สำหรับผม ก็ถือว่าหนาวแล้วขนาดนี้ บรื๊ออออออก็ลองเอาไปประยุกต์กันดูครับ ง่ายๆ อุ่นเครื่องกันเท่านี้ก่อนหล่ะกัน สวัสดีครับ

image

ที่มา raspberrypi-spy.co.uk

เสร็จแล้ว ก็ลอง Polling data ด้วย Python ดูสักหน่อยสิ

python_read_ds18b20

ปล. ลืมไปว่าเราสามารถแทรก คำสั่ง modprobe ในโค๊ดนี้ก็ได้ จะได้ว่า


import os
from time import sleep

os.system('sudo modprobe w1-gpio')
os.system('sudo modprobe w1_therm')

while True:
    tfile = open("/sys/bus/w1/devices/28-0000031280c7/w1_slave")
    text = tfile.read()
    tfile.close()
    temperature_data = text.split()[-1]
    temperature = float(temperature_data[2:])
    temperature = temperature / 1000
    print temperature
    sleep(2)

อ่านเพิ่มเติม...

Thursday, December 26

กล่องใส่ Raspberry Pi ฟรีๆ ( a card case for raspberry pi)

The Punnet - a card case for you to print (for free)

   จริงๆ บอร์ด Raspberry pi หน่ะ ไม่แพงหรอก แต่ พอรวมอุปกรณ์ประกอบอื่นๆ ไปๆมาๆ จะแพงกว่าบอร์ด Raspberry pi เสียด้วยซ้ำ จะไม่ low cost ซะแล้ว ยิ่งเจ้ากล่องที่ใส่ Raspberry pi นี่ ก็มีตั้งแต่ ราคา 150 บาท ไปจนถึง 5-600 บาท  ไม่รู้จะแพงไปไหน อีกหนำซ้ำ เจ้าบอร์ด Raspberry pi มันก็ไม่ได้สี่เหลี่ยมแปะๆ ซะทีไหนหล่ะ ยังอุตส่าห์มี SD-card ยื่นออกมา จะเอากล่องทั่วไป ก็ใช่ว่าจะได้ขนาดที่พอดี

เอางี้แล้วกัน เรามาทำกล่องใส่ที่เป็นกระดาษกันดีกว่า ประหยัดดี มีคนทำต้นแบบไว้ให้แล้ว ที่เหลือก็หาวัสดุึที่พอจะพับเป็นกล่อง ยิ่งถ้าทนน้ำ ได้ิยิ่งดี จะได้ทนๆ หน่อย ว่าแล้วก็ไปโหลดมามาปริ้นท์ แล้วพับตามกันเลย

ดาวน์โหลด http://squareitround.co.uk/Resources/Punnet_net_Mk1.pdf

a printable card case for the Raspberry Pi

ที่มา http://www.raspberrypi.org/archives/1310

อ่านเพิ่มเติม...

Thursday, February 28

How to getting started WiringPi

ในการควบคุม GPIO ของ Raspberry pi นอกจากเราจะทำการ echo ค่า 1 และ 0 ไปที่ Filesystem ที่ชื่อ sysfs ของระบบ linux ที่เป็นที่เก็บไฟล์ื่ที่ติดต่อกับ GPIO Hardware ของ Raspberry Pi แล้ว (http://raspberry-pi-th.blogspot.com/2012/09/get-to-know-raspberry-pi-gpio.html) ยังมีอีกหลายวิธี ไม่ว่าจะเป็นการเรียกใช้ module RPi.GPIO(http://raspberry-pi-th.blogspot.com/2012/10/rpigpio-python-control-gpo-of-raspberry.html) ที่พัฒนาด้วยภาษาไพธอน แต่ก็ยังไม่ค่อยตอบโจทย์ผมเท่าไหร่ เพราะต้องใช้สิทธิ์ root ในการเรียกใช้คำสั่งเหล่านั้น ซึ่งไม่ค่อยสะดวกเท่าไหร่

วันนี้ผมจะมาแนะนำอีกหนึ่งไลบรารี่ ของคุณ Gordon Henderson ซึ่งได้พัฒนาชุดโปรแกรมสำหรับเรียกใช้งาน GPIO ของ Raspberry pi ด้วยภาษา C ซึ่งเข้าถึงรีจิสเตอร์ของ GPU ของ Raspberry Pi เลย และที่สำคัญ เราสามารถเรียกใช้ไลบรารี่ชุดนี้ ได้เหมือนคำสั่ง shell ของ linux ได้เหมือนๆ คำสั่งอื่นๆ ทั่วไป โดยไม่จำเป็นต้องเป็นสิทธิ์ Root ก่อนเลย ซึ่งสะดวกเป็นอย่างยิ่งครับ ในการนำไปต่อยอดพัฒนาโปรแกรมอื่นๆ ต่อไป 

เรามาติดตั้งกันก่อนเลยครับ เนื่องจากโปรแกรมนี้ ถูกเก็บไว้ด้วยรูปแบบกระจายซอร์สโค๊ดด้วย git-core หากเรายังไม่มี package นี้ในการช่วยดาวน์โหลดซอร์สโค๊ดต่างๆ จากผู้พัฒนาโปรแกรมให้ติดตั้ง git-core ด้วยคำสั่ง

sudo apt-get install git-core

จากนั้นทำการดาวน์โหลด wiringPi ด้วยคำสั่ง

git clone git://git.drogon.net/wiringPi

จากนั้นเข้าไปในโฟวเดอร์ wirignpi แล้วทำการเช็คอัพเดท

cd wiringPi
git pull origin

ต่อไปให้ทำการติดตั้ง ซึ่งจะเป็นการ compile โค๊ดที่เราโหลดมาบนบอร์ดของ โดยออกจากโฟวเดอร์ wiringPi ก่อน โดยเรียกคำสั่ง

cd ..
จากนั้นทำการรันไฟล์ build ด้วยคำสั่ง

./build

Raspberry pi จะทำการ compile wiringPi เพื่อให้กลายเป็นคำสั่ง shell ให้เราเรียกใช้ง่ายๆ ต่อไป

เมื่อ compile เสร็จแล้ว เราจะสามารถเรียกใช้คำสั่ง gpio ได้  ให้เราจินตนาการง่ายๆ ว่า คำสั่ง gpio ก็เหมือนคำสั่ง ls หรือ คำสั่ง cat หรือ cp เหมือนคำสั่งอื่นๆ บน linux นั่นเอง ดังนั้น มันจึงสามารถที่จะเรียกดูํ manual ของมันได้เช่นกัน ด้วยคำสั่ง

man gpio

ในคู่มือที่แสดงนี้ จะบอกถึงวิธีการเรียกใช้คำสั่งนี้ และที่ท้ายๆ คู่มือ เค้าจะเขียนบอกการจับคู่ขา WiringPi กับ GPIO จริงๆ ทั้ง Rev1 และ Rev2 ครับ

man gpio

ผมขออธิบายการเรียกใช้งานคร่าวๆ ของคำสั่ง gpio นี้นะครับ ที่เหลือ สามารถศึกษาเพิ่มเติมได้ใน man gpio นี้แหละครับ

ในการเรียกใช้งาน GPIO ของ Raspberry pi โดยค่าเริ่มต้น เมื่อเราจ่ายไฟไปที่บอร์ด Raspberry pi เริ่มต้น ที่ GPIO ส่วนใหญ่ จะมี สถานะเป็น Input หากเราต้องการนำขา GPIO ไปใช้งานเป็น Output แล้ว เราจะต้องทำการกำหนดทิศทางของ GPIO ซะก่อน ด้วยคำสั่ง

gpio mode 0 out <--- สั่งให้ wirignpi pin 0 ทำหน้าที่เป็น output
gpio write 0 1  <--- สั่งให้เขียนค่า 1 ไปที่ wiringpi pin 0 ซึ่งจะเกิด login high ที่ pin นี้

ผมลองเปิด webiopi เพื่อเช็คสถานะของ GPIO ไปด้วย ( http://raspberry-pi-th.blogspot.com/2013/01/webiopi-control-raspberry-pi-s-gpio-via.html )

gpio mode 0 out

ในทำนองตรงกันข้าม หากเราต้องการให้ pin ใดๆ ทำหน้าที่เป็น input รอรับสถานะทางไฟฟ้า ก็กำหนดเป็น in แล้้วใช้คำว่า read แทนการ write ดังต่อไปนี้

gpio mode 11 in
gpio read 11 

หวังว่าคงไม่ งง นะครับ ว่าทำไม 11 กับ GPIO7 มันเกี่ยวข้องอะไรกัน ซึ่งมันเป็นเรื่องของการตั้งชื่อ map pin เข้ากับตัวโค๊ดของผู้เขียนโปรแกรมนั่นเอง ไม่มีอะไรมาก

gpio mod 11 in

นอกจากนี้ คำสั่ง gpio ยังมีลูกเล่นอื่นๆ อีกไม่ว่าจะเป็นการสร้างสัญญาณ PWM หรือการอ่านสถานะ pin ทั้งหมดก็สามารถทำได้เช่นกัน ลองศึกษาเพิ่มเติมดูจากคำสั่ง man gpio หรือที่เว็บ https://projects.drogon.net/raspberry-pi/wiringpi/

เดี๋ยวต่อไป ผมจะยกตัวอย่างการนำคำสั่ง gpio ไปลองใช้งานในด้านอื่นๆ ดูบ้างครับ ขอให้สนุกกับ Raspberry pi นะครับ

อ่านเพิ่มเติม...

Monday, February 4

How to install MJPG-Streamer

MJPG-Streamer คือ โปรแกรมประเภทคำสั่งที่สามารถพิมพ์คำสั่งลงไป แล้วโปรแกรมจะทำการดึงภาพออกจากเว็บแคมของเรา แล้วทำการส่งไปเก็บไว้ เพื่อที่เราจะสามารถเข้ามาดูได้ โดยผ่านเว็บบราวเซอร์ หรือผ่านทางมือถือก็ได้

บทความต่อไปนี้ ผมได้ค้นหามาจาก http://www.raspberrypi.org/phpBB3/viewtopic.php?f=30&t=8659  ซึ่งก่อนหน้านี้ ผมพยายามทำมาหลายครั้งแล้ว แต่ ไม่ประสบความสำเร็จเหมือนคนอื่นเค้า เนื่องจากบอร์ด Raspberry Pi ของผมเป็น Model B rev 1 ซึ่งอาจจะมีอุปสรรคมากกว่าบอร์ดรุ่นใหม่ๆ สักหน่อย ซึ่งอาจจะทำให้บทความนี้ อาจจะไม่เวิร์กสำหรับคนอื่นก็ได้ ก็ต้องขอบอกไว้ ณ ทีนี้ด้วย ซึ่งการที่เราจะต่ออุปกรณ์อะไรสักอย่างกับ Linux ย่อมมีอุปกรณ์เรื่องของ driver ที่ไม่รองรับ นั่นเป็นเรื่องธรรมดาของ Linux OS ครับ (ต้องทำใจนิดนึง)

อุปกรณ์ที่ผมใช้ก็คือ บอร์ด Raspberry Pi Model B rev 1 ซึ่งมี RAM อยู่ 256 กับกล้อง WebCam ยี่ห้อ OKER รุ่น Webcam OKER (177) ซึ่งนับว่าโชคดีมาก ที่เจ้า Driver kernel ของผมมันรองรับพอดี หากเพื่อน ต้องการทราบว่ากล้องรุ่นใดบ้างที่ driver รองรับ สามารถตรวจสอบได้ที่ http://www.ideasonboard.org/uvc/

เรามาเริ่มกันเลยครับ หลังจากที่เราได้เช็คอัพเดทแล้ว sudo apt-get update ให้เราไปโหลด package เหล่านี้มาก่อน ได้แก่

sudo apt-get install subversion
sudo apt-get install libv4l-dev
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick

ซึ่ง Subversion เป็นตัวเอาไว้โหลดซอร์สโค๊ดจาก svn server ที่นักพัฒนาโปรแกรมนิยมเอาไปเก็บไว้ครับ ส่วน package อื่นๆ ที่เหลือ ก็เกี่ยวเนื่อง และ เป็นไลบรารี่เสริมในการ

compile MJPG-Streamer อีกทีครับ

ตอนนี้เราจะโหลด MJPG-Streamer บ้างหล่ะ ให้ใช้คำสั่งนี้ครับ ซึ่งจะได้ตัวอัพเดทล่าสุดเลย

svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer

เสร็จแล้วให้เข้าไปที่โฟวเดอร์ mjpg-streamer/mjpg-streamer ด้วยคำสั่ง

cd mjpg-streamer/mjpg-streamer 

จากนั้นเราจะทำการ compile โปรแกรมของเราหล่ะ ด้วยคำสั่ง

make USE_LIBV4L2=true clean all

ซึ่งไม่น่าจะมี error ใดๆ ขึ้นมานะครับ (อาจจะมี warning ได้ แต่ อย่าให้มี error ก็แล้วกัน ) เสร็จแล้วก็ตามด้วย

sudo make DESTDIR=/usr install

หากไม่มี error แล้ว ให้เราทำการเสียบกล้อง webcam ของเราเข้าทาง port USB ของบอร์ด Raspberry pi ครับ ก่อนที่จะเสียบสาย USB เราอาจจะสั่งคำสั่ง

tail -f /var/log/messages

เพื่อดูว่า uvcvideo kernel driver มองเห็นอุปกรณ์ที่เป็น camera หรือยัง ถ้ามองเห็นแล้ว ควรจะได้ข้อความตามรูปข้างล่าง

uvcvideo kernel driver found webcam

จากนั้น ผมลองติดตั้ง fswebcam ซึ่งตัวนี้ ผมจะใช้เป็นตัวเช็คว่า ผมจะต้องปรับค่า output ที่กล้องให้ค่าได้เป็นอะไร ซึ่งเราจะนำไปใช้ในการตั้งค่า streamer ต่อไป 

ติดตั้ง fswebcam  ด้วยคำสั่ง

sudo apt-get install fswebcam

เสร็จแล้วให้ใช้คำสั่ง

fswebcam --verbose

fswebcam --verbose

ซึ่งจากข้อมูลที่ได้มา ผมควรที่จะปรับค่า output ที่จะได้จาก streamer ให้เป็น YUYV และ frame rate ควรจะเท่ากับ 4

ผมก็นำเอาข้อมูลที่ได้นี้ มาใช้ร่วมกับคำสั่ง

mjpg_streamer -i "/usr/lib/input_uvc.so -d /dev/video0  -r 352x288 -f 4 -y YUYV" -o "/usr/lib/output_http.so -p 8090 -w /var/www/mjpg_streamer"

image

(ศึกษาพารามิเตอร์ต่างๆ ได้ที่ คำสั่ง mjpg_streamer --help  หรือ จากไฟล์ /home/pi/mjpg-streamer/mjpg-streamer/start.sh )

หลังจากที่สั่งคำสั่ง เรียบร้อยแล้ว จะเกิดการ stream ภาพที่ได้จากกล้องไปเก็บไว้ที่ web root folder เราสามารถเปิดดูภาพที่ได้ผ่านหน้าเว็บบราวเซอร์ได้เลย โดยใส่  URL ไปที่ ip ของ Raspberry pi แล้วตามด้วยพอร์ต 8090 ครับ จากนั้นตามด้วยพารามิเตอร์ ?action=stream

สมมติว่า ip address ของบอร์ด raspberry pi เท่ากับ 192.168.2.105 จะได้ว่า

http://192.168.2.105:8090/?action=stream

ที่หน้าเว็บบราวเซอร์จะพบภาพจากกล้องเว็บแคมของเราครับ MJPG-Streamer work

ถ้าเพื่อนๆ ลองปรับพารามิเตอร์คำสั่ง mjpg_streamer ให้เหมาะกับ output ของกล้องหล่ะก็ ภาพที่ได้จะออกมาดี (เท่าที่กล้องมันจะทำได้) เลยหล่ะครับ หวังว่าคงเป็นประโยชน์ นำไปต่อยอดกันได้นะครับ

อ่านเพิ่มเติม...

Wednesday, January 30

WebIOPi : Control Raspberry Pi ‘s GPIO via web browser

เราทราบดีอยู่แล้วว่า Raspberry pi นั้น สามารถทำให้เป็น web Server ได้ และในขณะเดียวกัน ก็ยังมี GPIO เหลือไว้ให้นักพัฒนาไว้ทำอะไรเล่นได้แตกต่างจาก PC ทั่วไปที่ไม่มี GPIO ให้ใช้ ก็เลยมีคนคิดที่จะทำ web application ที่สามารถที่จะควบคุม GPIO ผ่านทางหน้าเว็บ วันนี้ เรามาติดตั้ง web application ตัวหนึุ่่งที่น่าสนใจสำหรับ Raspberry pi นั่นก็คือ WebIOPi

WebIOPi คือเว็บแอพลิเคชั่น ที่ออกแบบด้วยภาษา Python ซึ่งทำงานร่วมกับ REST framework  จุดประสงค์เพื่อให้การควบคุม GPIO ของ Raspberry Pi แสดงผล แบบ(เกือบจะ) Realtime ให้เห็นผ่านหน้าเว็บ โดยที่เราไม่ต้อง refresh หน้าเว็บ เมื่อ GPIO มีการเปลี่ยนแปลงสถานะ

"WebIOPi is developed and tested on Raspbian"

เพราะฉะนั้นใครทีใช้ Raspian อยู่แล้ว ก็ไม่น่ามีปัญหาอะไร ขั้นตอนติดตั้งไม่ยุ่งยากครับ เริ่มจากดาวน์โหลดไฟล์ แล้วก็ทำการรันสคริปต์ที่ติดตั้ง

wget http://webiopi.googlecode.com/files/WebIOPi-0.5.3.tar.gz
tar xvzf WebIOPi-0.5.3.tar.gz
cd WebIOPi-0.5.3
sudo ./setup.sh

รอสักครู่ จากนั้นก็สั่งให้ webiopi ทำงานด้วยการรันเซอร์วิส

sudo /etc/init.d/webiopi start

หากต้องการสั่งให้เซอร์วิสหยุดทำงาน ก็ตรงกันข้ามครับ

sudo /etc/init.d/webiopi stop

แต่ถ้าถูกใจแอพพลิเคชั่นนี้ และอยากให้ทำงานทุกครั้งที่เปิดเครื่องแล้วหล่ะก็ ให้กำหนดเป็นค่า default ตอนเปิดเครื่องไปเลย ด้วยคำสั่ง

sudo update-rc.d webiopi defaults

หลังจากนั้น เปิด web browser ของเราขึ้นมา แล้วกรอก URL ไปที่ไอพีของ Raspberry Pi ครับโดยใส่ port 8000 เข้าไปด้วย

เช่น ไอพีบอร์ด raspberry pi ของผมเป็น 192.168.2.105 จะได้ว่า  http://192.168.2.105:80000/webiopi/ ครับ

ทำการกรอก username / password ครับ ในที่นี้ถูกกำหนดเป็น webiopi รหัสผ่านก็ raspberry ครับ

จะปรากฏหน้าเว็บ จากนั้น ลองกำหนดให้ GPIO ใดๆ ก็ได้เป็น OUT แล้วลองเอา LED ต่อที่ pin นั้นๆ จากนั้นกดเปลี่ยนสถานะ หากเป็น Hi จะเปลี่ยนสีเป็นสีเหลืองที่หน้าเว็บ ที่หลอด LED ก็ควรจะติดด้วย

WebIOPi control Raspberry pi 's GPIO

ทดลองเปิดหน้าเว็บจากคอมพิวเตอร์เครื่องอื่น หรือเปิด browser เพิ่มอีก และดูผลการเปลี่ยนแปลง เราจะเห็นว่าหน้าเว็บแสดงผลได้แทบจะทันทีทันใด ที่มีการเปลี่ยนแปลงที่ GPIO ครับ นั่นก็เป็นเพราะ REST framework นั่นเอง

ลองติดตั้ง แล้วศึกษาตัวโปรเจคนี้ดูครับ รับรองได้ประโยชน์แน่นอน

แหล่งที่มา : http://code.google.com/p/webiopi/

อ่านเพิ่มเติม...

Saturday, January 19

Putty tip#1

เวลาผมใช้ คำสั่ง pstree หรือ tree บน putty terminal จะเจอปัญหาว่าไม่สามารถแสดงเส้นทาง โครงสร้างของไดเรกทอรีได้ วันนี้ก็เลยเอารูปการแก้ปัญหามาฝากครับ ลองไปปรับแต่งกันดู

putty

pstree คือ คำสั่งแสดงโครงสร้างของ process ที่ำกำลังทำงานอยู่ ณ ขณะนั้น ว่ามี process หลัก และ process ย่อย ซ้อนกันอยู่อย่างไร

tree คือ คำสั่งแสดงโครงสร้างของไดเรกทอรี่ และ ไฟล์ที่ซ้อนกันอยู่

เล็กๆ น้อยๆ สำหรับวันนี้ครับ มีความสุข เสาร์ อาทิตย์ นะครับ

อ่านเพิ่มเติม...
 

แจกฟรี พื้นที่ฝากไฟล์ 15 GB

ติดตามข่าวสารผ่าน Twitter

ติดตาม Blog นี้

Blog อื่นๆของฉัน

Microcontroller Electronics update

สถิติเยี่ยมชมบล๊อก