Wednesday, September 26

The Pi4J Project เอาใจโปรแกรมเมอร์ Java ที่อยากทดลองกับ Raspberry Pi

image

    The Pi4J Project ได้ออกชุดไลบรารีสำหรับภาษาจาวา ให้สามารถเชื่อมต่อ สั่งงาน GPIO บน Raspberry Pi ซึ่งนับว่าเป็นการเปิดการเชื่อมต่อของ Raspberry Pi ออกไปอีกทางหนึ่ง ให้ผู้ที่มีความสามารถทางภาษาจาวา ได้สามารถเรียกใช้ Library ด้วยภาษาจาวาทำการติดต่อ และสั่งงานขา GPIO ได้

 

คุณสมบัติ
- Export & unexport GPIO pins
- Configure GPIO pin direction
- Configure GPIO pin edge detection
- Control/write GPIO pin states
- Pulse GPIO pin state
- Read GPIO pin states
- Listen for GPIO pin state changes (interrupt-based; not polling)
- Automatically set GPIO states on program termination (GPIO shutdown)
- Triggers for automation based on pin state changes
- Send & receive data via RS232 serial communication
- Access system information and network information from the Raspberry Pi
- Wrapper classes for direct access to WiringPi Library from Java

Import Pi4J Packages

Create Controller Instance

 

สาวก Java ดาวน์โหลด Pi4J library  ( คลิก )

แล้วทำการติดตั้ง  ( คลิก )

ส่วน วิธีการใช้งาน ( คลิก ) ก็ทำตามขั้นตอนได้เลยครับ

นอกจากนี้ ยังมีเอกสารของ JavaDoc ( คลิก ) ให้อ่านอีกด้วย

ตัวอย่างการทำ  GPIO State Listener

\Wiring Diagram

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

Tuesday, September 25

Get to know Raspberry Pi GPIO

    นอกจากเจ้าบอร์ด Raspberry Pi ของเราจะมี Port ต่างๆให้ใช้งานแล้ว ไม่ว่าจะเป็น Port USB , Port Network , Port Audio เป็นต้นแล้ว พอร์ตต่างๆ พวกนี้ ล้วนต่อเข้ากับซีฟไอซีเบอร์ BCM2835 ARM pheriperal ซึ่งทำหน้าที่เป็นแขน เป็นขา เป็นหูเป็นตา เอาไว้ใช้งานของเจ้า CPU แล้ว ที่ไอซีเบอร์นี้ ยังมีช่อง GPIO เหลือ จากการต่อกับพอร์ตเหล่านั้น มาให้เราใช้งานอีก ซึ่งเค้าเหลือไว้สำหรับให้เราเอาไปใช้งานอะไรก็ได้ ตามแต่เราจะนึกอยากใช้ จะสังเกตเห็น Pin ตัวผู้ เรียงเป็นแถวคู่ 2 แถวนั่นแหละครับ เป็นแนว PIN GPIO

 Raspberry Pi main board

     GPIO ย่อมาจาก General Purpose Input/Output นั่นก็แปลว่า ขา pin เหล่านี้ มีไว้ใช้ในงานทั่วๆ ไป โดยควบคุมผ่านซอร์ฟแวร์ โดยในที่นี้ เราจะมาดูขา GPIO ของเจ้าบอร์ด Raspberry Pi ของเรานะครับ ส่วนถ้าเป็นบอร์ดอื่นๆ ก็ค่อยมาว่ากันต่อไป ดูรูปข้างล่าง แล้วเทียบกับบอร์ดจริงนะครับ

Raspberry Pi GPIO Mapping

    ถึงแม้ที่ขั้วต่อ P1 ตำแหน่งที่ P1-02 มีแรงดัน 5 Vdc นั่นก็ไม่ได้หมายความว่า ขา GPIO ที่เหลือจะรับแรงดันได้ 5 Vdc นะครับ ทุกขาของ GPIO สามารถรับแรงดัน หรือจ่ายแรงดันไฟตรง ได้ไม่เกิน 3.3 Vdc เท่านั้น ตรงนี้ ต้องระวังให้ดี เพราะถ้าดูจากลายวงจรของบอร์ดแล้วหล่ะก็ จะพบว่า ตำแหน่งขั้วต่อ P1 นั้น ต่อตรงเข้าไปที่ chip ของ ARM Processor เลย นอกจากเรื่องแรงดันไฟกระแสตรง ที่เราต้องระวังไม่ให้รับไฟเกินแล้ว เรายังต้องระวังเรื่องของไฟฟ้าสถิตย์ที่อยู่รอบๆ ตัวเรา จะชาร์ตเข้าไปที่ขาดังกล่าวด้วย วิธิป้องกัน ก็พยายามสัมผัสที่ขั้วพวกนี้ ให้น้อย หรือไม่ก็ทำขั้วต่อออกมา เป็นพวกสายแพร ที่มีขั้วต่อเป็นแบบพลาสติก เพื่อป้องกันการสัมผัสจากตัวเราไปโดนที่ขาเหล่านี้โดยตรง (หลีกเลี่ยงให้มากที่สุด ว่างั้นเหอะ)

    ในบางตำแหน่ง pin สามารถทำงานในอีกฟังก์ชั่นหนึ่ง สังเกตจากตาราง ที่ช่อง Alt 0 Function จะพบนอกจากจะทำหน้าที่เป็น GPIO แล้ว ยังทำหน้าที่อื่นได้อีกด้วย เช่น I2C , SPI , UART  แต่ไม่มีขาไหนทำหน้าที่ ADC เพื่อรับสัญญาณ Analog เลย เราคงต้องต่อไอซีเพิ่ม หากต้องการอ่านค่าจาก Sensor หรือจาก output ของอุปกรณ์ใดๆ ที่ให้สัญญาณ Analog เข้ามาที่บอร์ด Raspberry Pi

GPIO function table1 GPIO function table2

     ทั้งหมดนั่นเป็น GPIO ที่ Raspberry Pi เหลือไว้ให้เราใช้ จริงๆ มันมี GPIO มากกว่านี้ แต่มันถูกนำไปใช้อ่าน SD-Card บ้าง ใช้ทำ HDMI บ้าง ใช้ต่อกับอุปกรณ์อื่นๆ เช่น Port Network , Audio out บ้าง ทำให้เหลือ GPIO ให้เราใช้เพียงเท่านี้ แต่นั่นก็เพียงพอ แล้วหล่ะผมว่านะ ถ้าใครต้องการ GPIO เพิ่มมากกว่านี้ ก็อาจจะใส่ไอซีขยายพอร์ต ที่สื่อสารผ่าน I2C หรือ SPI ก็ได้ เพราะเรามี GPIO พวกที่ติดต่อผ่าน Protocal พวกนี้ได้อยู่แล้ว

    ในการพัฒนาโปรแกรม เพื่อเรียกใช้ GPIO นั้น ตอนนี้ ก็มีหลายๆ คนใช้ภาษา GCC ก็มี ใช้ Python ก็มี หรือแม้แต่จะใช้ความสามารถของ Shell ที่มีอยู่แล้ว คู่กับ Linux มาก็ได้ ในการติดต่อกับ GPIO พวกนี้ ไม่ว่าจะใช้ภาษาใดก็ตาม สุดท้ายแล้ว เรากำลังเล่นกับ Filesystem ที่ชื่อ sysfs ที่อยู่ใน memory ซึ่งเป็นส่วนที่ไว้ติดต่อกับ Kernel ของ Linux นั่นเอง ศึกษาเพิ่มเติมได้จาก "การใช้งาน GPIO บน Embedded Linux" ของท่าน atlantaman ครับ

GPIO on Embedded Linux

    ในตอนนี้ ผมจะทดสอบการติดต่อกับ GPIO7 ด้วยคำสั่ง Shell นี่แหละครับ เพื่อให้เกิดความเข้าใจกันก่อน ซึ่งในตอนต่อไป เราคงจะไปเรียกใช้ Lib ที่มีคนทำไว้แล้ว มาใช้งาน น่าจะสะดวกกว่า

    ซึ่งเจ้า sysfs ที่ติดต่อกับ GPIO นั่น จะอยู่ใน folder /sys/class/gpio ใน folder นี้ จะเป็นของ root ครับ เราจะต้องแปลงร่างตัวเองให้กลายเป็น root ก่อน โดยใช้คำสั่ง

su root 

จากนั้นก็ใส่ password ของ root เข้าไป หากจำไม่ได้ หรือยังไม่ได้เปลี่ยน ก็ให้เปลี่ยน password root ซะ ด้วยคำสั่ง

sudo passwd root 

change root password

แล้วก็เปลี่ยนตัวเองให้กลายเป็น root สังเกตว่า จะเปลี่ยนจาก $ กลายเป็น # แสดงว่าเรากลายเป็น root แล้ว

เราอาาจะต้องลง package tree เพื่อเรียกใช้คำสั่ง tree เพื่อเอาไว้ดูว่าโครงสร้าง folder เป็นอย่างไร อันนี้จะลง หรือไม่ลง ก็ไม่เกี่ยวกับการสั่ง GPIO นะครับ เพียงแต่มันทำให้เราเห็นโครงสร้าง folder หรือ link file เท่านั้นเอง

ติดตั้ง tree package ใช้คำสั่ง

apt-get install tree (ถ้าเราเป็น root อยู่แล้ว) หรือใช้คำสั่ง
sudo apt-get install tree (หากเราไม่ได้เป็น root ครับ )

เปลี่ยนตัวเองเป็น root แล้วเข้าไปที่

cd /sys/class/gpio

แล้วลองเรียกใช้คำสั่ง tree gpiochip0 ดู ผลลัพธ์ แล้วศึกษาตามลิ้งค์ที่ให้ไปครับ ว่าคล้ายกันไหม

apt-get install tree

เราจำเป็นต้องสร้าง link file ก่อนครับ เพื่อให้ link file ที่เราสร้าง เชื่อมโยงกับ GPIO7 ก่อน ด้วยคำสั่ง

echo 7 > export

เมื่อเราใช้คำสั่ง ls -la เราจะพบว่า เกิด link file เกิดขึ้น ชื่อ gpio7

ต่อไป ก็กำหนดให้ GPIO7 ทำหน้าที่เป็น output pin ซะ ด้วยคำสั่ง

echo out > gpio7/direction

ตอนนี้ gpio7 ของเรากลายเป็น output pin แล้ว ที่เหลือก็สั่งให้เกิด logic 1,0 เพื่อให้เกิดสัญญาณดิจิตอลที่ขา GPIO7  ด้วยคำสั่ง

echo 1 > gpio7/value
echo 0 > gpio7/value

toggle GPIO7 on Raspberry Pi GPIO

สังเกตที่บอร์ดของเรา ที่เราได้ต่อ LED อนุกรมกับ R ค่าสักประมาณ 330 - 560 โอห์ม กับหลอด LED ที่หลอดนี้ จะติดดับตามคำสั่งของเรา

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

Monday, September 24

TightVNCServer รีโมทเข้าใช้ Raspberry Pi ใน X-window mode

วันนี้ เราจะมาติดตั้ง TightVNCServer ให้กับบอร์ด Raspberry Pi เพื่อให้ผู้ใช้งานสามารถที่จะเข้าใช้ในโหมด X-windows ของ Raspian ได้ โดยที่ผู้ใช้งานไม่ต้องต่อจอทีวีเข้ากับบอร์ด Raspberry Pi ก็สามารถที่จะมองเห็น X-Windows ของเจ้า Raspian ได้เลย

หลังจากที่เราได้ติดตั้ง SSH ไปเรียบร้อยแล้ว (จากตอนที่แล้ว) ทำการ login ด้วย user pi ตามปกติ

ทำการติดตั้งซอร์ฟแวร์ชื่อ tightvncserver ด้วยคำสั่ง

sudo apt-get install tightvncserver

รอสักครู่ โปรแกรมจะทำการติดตั้ง เสร็จแล้ว (ซึ่งไม่ควรจะเกิด Error message ใดๆ) ต่อไปเราก็จะทำตั้งค่าให้โปรแกรม tightvncserver กำหนดค่าความกว้าง ยาว ของหน้าต่าง vnc client ที่จะรีโมทเข้ามา และกำหนด port ที่จะเปิดใช้งานของ service tightvncserver ด้วยคำสั่ง ยาวๆ ดังนี้ครับ

vncserver :1 -geometry 1280x800 -depth 16 -pixelformat rgb565

VNC setting service

เสร็จขั้นตอนการกำหนดค่า tightvncserver ผ่าน terminal ของ SSH ครับ

ก่อนที่เราจะรีโมทเข้าไปในโหมด graphic ของ raspian นั่นก็คือ X-windows ของมัน เราจะมีโปรแกรมจำพวก vnc client ครับ ซึ่งก็มีหลายค่ายให้เราเลือกใช้ ในทีนี้ ผมขอเลือกใช้โปรแกรม Ultra VNC Viewer ครับ (ดาวน์โหลดได้ฟรี ที่นี่)  ติดตั้งโปรแกรมตามปกติ (พอดีไม่ได้ capture ตอนติดตั้งไว้ครับ :P )

เปิดโปรแกรมขึ้นมา ทำการเชื่อมต่อไปยังไอพี ของบอร์ด Raspberry Pi (ยังไม่ลืมนะครับ ว่าบอร์ด Raspberry pi ของเรา ยังต้องเชื่อมต่อเข้ากับระบบเนตเวิร์กในบ้านของเราด้วย เหมือนเดิม) ต่อจากไอพีแอดแดรสของบอร์ดแล้ว เรายังต้องเพิ่ม port ที่ใช้ในการเชื่อมต่อด้วย ถ้ายังไม่ลืมจากขั้นตอนข้างบน เราได้ทำการกำหนดให้ VNC server ให้บริการผ่าน port หมายเลข 1 ยังงัยหล่ะครับ (vncserver :1) 

ในทีนี้ บอร์ด raspberry pi ผมได้ไอพี 192.168.2.111 เพราะฉะนั้น เมื่อใส่ port ต่อท้ายที่ช่อง VNC Server : จะได้ 192.168.2.111:1

กด connect

UltraVNC Viewer

ใส่ password ของ user pi นั่นก็คือ raspberry

ultra vncviewer password

โอเค น่าจะได้หน้าต่างนี้ กันทุกคนนะครับ

TightVNCServer display

แต่ อ๋อ เกือบลืมบอกไป ว่า ที่เรากำหนดให้ vncserver ทำงานหน่ะ พอเรา reboot ครั้งต่อไป vncserver จะไม่ทำงานนะครับ เราต้องกำหนดให้ vncserver ทำงานทุกครั้งหลังจากที่เรา reboot ด้วยนะครับ (ในอนาคต เพื่อนๆ อาจจะสร้างสคริปต์ให้มัน start service นี้ทุกครั้งก็ได้นะครับ เมื่อเราเข้าใจการเขียน shell ดีแล้ว)

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

Thursday, September 20

ติดตั้งและกำหนดค่าการเชื่อมต่อกับ Raspberry Pi ผ่านทาง SSH (Setup SSH and Configure Putty for remote RPi)

top - display Linux processes      ถ้าใครเคยใช้ Linux หรือ UNIX  รุ่นเก่าๆ มาก่อน อาจจะเคยใช้ telnet เพื่อเข้าไปใช้งานที่เครื่องที่โดนเรา remote เข้าไป จะว่าไปเรา ก็เสมือนหนึ่งว่า เราเข้าไปนั่งที่เครื่องนั้น นั่นแหละ เราสามารถที่จะทำอะไรก็ได้ ไม่ว่าจะเป็น การอ่าน การเขียนไฟล์ หรือการลบไฟล์ ใดๆ ก็ได้ตามสิทธิ์ที่เรา login เข้าไป เพียงแค่ว่า เราไม่ได้ไปนั่งอยู่หน้าเครื่องนั้นจริงๆ เราก็นั่งทำงานของเราอยู่ที่นี่ แต่ ทุกอย่างทำอยู่อีก process หนึ่ง ที่ทำงานอยู่เบื้องหลัง เครื่องที่เรารีโมท เข้าไป

แต่ ในเวอร์ชั่นหลังๆ ของ LINUX เค้าได้เปลี่ยนรูปแบบเป็น SSH หรือ Secure Shell แทน เนื่องจากมีความปลอดภัยมากกว่า สามารถป้องกันการสวมสิทธิ์จากผู้ไม่หวังดีได้ แต่ หน้าที่ก็ยังเหมือนเดิม คือ เหมือนกับการ Telnet นั่นแหละ แต่เปลี่ยแปลงทีการ login จะมีกลไกของการเข้ารหัสก่อน ในส่วนตรงนี้ เราไม่จำเป็นต้องสนใจมากเท่าไหร่ เพราะมันเป้นกลไก ของตัว OS เอง

เป็นที่ทราบอยู่แล้วว่า เจ้าบอร์ด Raspberry Pi ของเราไม่ได้มี VGA Port  ต่อมาด้วย เวลาต้องการใช้งานทางด้านแสดงผลหน้าจอ อาจจะต้องหาจอทีวี มาต่อใช้งาน แต่ในระบบปฏิบัติการ LINUX เราสามารถยืมหน้าจอเครื่องอื่น เพื่อทำหน้าที่แสดงผลของบอร์ด Raspberry Pi ด้วยวิธีการ SSH นั่นเอง

สิ่งที่ต้องเตรียมพร้อม คือ

   บอร์ด Raspberry Pi ที่ต่อสายเนตเวิร์ก ที่เชื่อมต่อเข้ากับระบบเนตเวิร์กภายใน(บ้าน) ในที่นี้ ผมจะให้ตัว Access Point (หรือ Router ก็ได้) ของผมทำหน้าที่แจก IP Address ให้กับอุปกรณ์อะไรก็ตามที่เชื่อมต่อเข้ามา รวมทั้งคอมพิวเตอร์โนตบุค ผมด้วย จากนั้นก็หาคีย์บอร์ด และจอทีวี มาต่อเข้ากับบอร์ด แล้วจ่ายไฟให้บอร์ด ทำการบูตตามปกติ

ต่อมาก็เป็นคอมพิวเตอร์โนตบุค ของเราที่ที่ทำการเชื่อมต่อเข้ากับระบบเนตเวิร์กภายใน(บ้าน) เช่นกัน จากนั้นทำการติดตั้งโปรแกรม Putty ซึ่งเราจะเอาไว้ใช้ในการรีโมทผ่าน SSH เพื่อเข้าไปที่บอร์ด Raspberry Pi ดาวน์โหลดโปรแกรม Putty ได้ ที่นี่ แล้วติดตั้งโปรแกรมตามความคุ้นเคย ตรงนี้ ยังไม่มีอะไรมาก Nextๆๆๆ ไปเรื่อยๆ จนติดตั้งสำเร็จ

กลับมาที่บอร์ด Raspberry Pi ของเรา ตอนนี้ สิ่งที่เราต้องรู้ให้ได้ว่า บอร์ด Raspberry Pi ของเรา ได้ IP Address ที่ได้รับมาจาก Access Point (หรือว่า Router ของเพื่อนๆ) ว่าได้ IP Address อะไร เพื่อที่เราจะได้นำค่า IP Address นี้ไปใส่ที่โปรแกรม Putty ของเราต่อไป

ทำการ login ปกติ
Raspberrypi login : pi
Password : raspberry

เมื่อ login สำเร็จแล้ว ให้พิมพ์คำสั่ง ต่อไปนี้

sudo bash แล้วเคาะ Enter
ssh-keygen แล้วเคาะ Enter ตามที่โปรแกรมถาม โดยไม่ต้องพิมพ์อะไร 3 ครั้ง

ทำการเช็คว่าโปรแกรมได้สร้างคีย์ให้หรือยัง โดยพิมพ์คำสั่ง


ls /root/.ssh/


จะเห็นไฟล์ปรากฎอยู่ใน folder นี้
ทำการสั่งให้ SSH service ทำงานด้วยคำสั่ง


sudo /etc/init.d/ssh start

เพื่อให้มั่นใจว่า start สำเร็จให้ทำการเช็คอีกที


sudo /etc/init.d/ssh status

ที่นี้ เราต้องกำหนดให้ SSH ทำงานทุกครั้งที่เราบูตระบบขึ้นมาใหม่
ใช้คำสั่ง

sudo update-rc.d ssh defaults

แล้วจึงทำการรีบูตระบบ 1 ครั้ง ด้วยคำสั่ง

sudo reboot

หลังจาก reboot เรียบร้อยแล้ว ให้ทำการ login อีกครั้ง แล้วทำการเช็ค IP Address ของบอร์ด Raspberry Pi ว่าได้รับไอพีอะไร (ปกติตัว Router หรือ Access point มันจะจ่าย IP เดิมให้กับบอร์ด ) ด้วยคำสั่ง


/sbin/ifconfig หรือคำสั่ง sudo ifconfig

ก็ได้ มองหาที่บรรทัดที่เขียนว่า inet addr : xxx.xxx.x.xxx ซึ่งอาจจะเป็น IP Adress 192.168.2.111 หรืออะไรก็ตามแต่ ขึ้นอยู่กับ Access Point หรือ Router ที่แจกมาให้ ก็ให้นำค่า IP Address นี้ไปกรองที่หน้าต่างโปรแกรม Putty ที่เราได้ติดตั้งไว้แล้วที่โนตบุค หรือ PC ของเรา

ที่หน้าต่างโปรแกรม Putty ที่เมนูด้านขวามือ ที่ Session ให้เราตั้งค่าตามที่เราได้มา จากนั้นกดปุ่ม Save แล้วไปที่เมนู SSH->X11 ติ๊กที่ช่อง Enable X11 forwarding แล้วกลับมาที่ Session ให้กดปุ่ม Save อีกครั้ง

 Configure Putty

Configure Putty

จากนั้นจึงทำการกดปุ่ม Open เพื่อเปิดการเชื่อมต่อ SSH เข้ากับบอร์ด Raspberry Pi

รอสักครู่ ถ้าสำเร็จที่หน้าจอคอมพ์ ของเราจะมีหน้าต่าง Terminal ขึ้นมา ให้เรากรอก login และ ใส่ Password เหมือนตอนที่เราทำกับหน้าจอทีวี ของเรา

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

แต่ว่า .... สิ่งที่ปรากฏที่ Terminal นั้นจะอยู่ในรูปของ text mode เท่านั้น พูดง่ายๆก็คือ เราไม่สามารถใช้ terminal ตัวนี้ เข้าไปที่ X-Windows ของเจ้า Raspberry Pi ได้ ซึ่งเป็นข้อจำกัดของโปรแกรม Putty นี้  แต่ถ้าจะเข้าไปใช้งาน X-Windows จริงๆ เราต้องทำเพิ่มเติมอีก เอาไว้ตอนหน้าหล่ะกัน

Rasoberrt Pi SSH by Putty

หากใครทำตามขั้นตอนแล้วไม่สำเร็จ ลองแก้ปัญหาตามนี้ ดูครับ

ให้พิมพ์คำสั่งนี้ เพื่อลบไฟล์ก่อน
sudo rm /etc/ssh/ssh_host_*

แล้วก็ตามด้วย
sudo dpkg-reconfigure openssh-server

ผมเอามาจาก forums ที่เค้าถามกันอยู่ ที่นี่ http://www.raspberrypi.org/phpBB3/viewtopic.php?f=27&t=15814

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

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

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

ติดตาม Blog นี้

About Me

My photo

สวัสดีครับ ชื่อเปิ้ลนะครับ ถ้ามีอะไรให้ช่วยเหลือได้ ก็จะช่วยครับ
ผมได้สร้างบล๊อกไว้ เพื่อเก็บรวบรวมความรู้ และประสบการณ์ในการทำงานครับ แวะไปเยี่ยมชมกันได้ครับ http://mechacity.blogspot.com และบล๊อก http://faker-programmer.blogspot.com ครับ

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

Microcontroller Electronics update

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