Author: shikima

ติดต่อ GPIO ของ RPi โดยใช้ python

เราสามารถใช้ RPi ควบคุมอุปกรณ์ภายนอกผ่านพอร์ท 40pin ที่ติดตั้งอยู่บน RPi ผ่านโมดูลที่มีมาให้อยู่แล้ว โดยใช้ภาษา C หรือ python ก็ได้ แล้วแต่ความถนัด ก่อนจะไปเขียนโปรแกรมลองมาดูขาต่างๆ ของ GPIO กันก่อน

ผมเลือกใช้ python ในการทดสอบแทนภาษา C เพราะ python เขียนง่ายกว่ามาก แถมเป็น interpreter ที่ไม่ต้องทำการ compile ก่อน ถ้าบรรทัดไหนเกิดข้อผิดพลาดขึ้น ก็จะมี error แสดงที่หน้าจอทันที ทำให้แก้ไขโปรแกรมได้ง่าย เหมาะแก่การหัดเขียนโปรแกรม

ก่อนอื่น ต้องติดตั้ง python และ GPIO ของ python ก่อน
ติดตั้ง python

sudo apt-get install python-dev

ติดตั้ง python-gpio

sudo apt-get install python-rpi.gpio

 

สร้างไฟล์ชื่อ blink.py

sudo nano blink.py

import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(21,GPIO.OUT)
while True:
   GPIO.output(21, True)
   sleep(1)
   GPIO.output(21, False)
   sleep(1)
GPIO.cleanup()

ต่อสายเข้า LED โดยให้ขา 40 (GPIO21) เข้าขา Anode และขา 6 (Ground) เข้าขา Cathode วิธีดูขา LED ถ้าเป็นขายาว จะเป็นขา Anode ส่วนขาสั้นจะเป็น Cathode แต่ถ้าขาถูกตัดไปแล้ว ให้ดู LED จากด้านบน ด้านที่แบนจะเป็นขา Cathode แรงดันที่ออกจาก RPi จะเป็น 3.3v ควรจะต่อ R สัก 330 โอม หรือ 560 โอม สักตัว เดี๋ยว LED จะเสียเอา

รันโปรแกรมโดยใช้คำสั่ง

sudo python blink.py

จะได้ผลลัพธ์ตามนี้


ถ้าต้องการหยุดโปรแกรมก็กด CTRL+C

ง่ายๆ เลยใช่ไหมครับ

ได้ Raspberry Pi มาฟรีทำยังไงกับมันดี

ผมได้ Raspberry Pi 2 model B (ขอเรียกว่า RPi ละกัน) มาฟรีๆ ตัวหนึ่ง ผมเคยได้ยินมาว่า เจ้า RPi ตัวนี้สามารถทำงานได้เยอะแยะมากมาย เช่นเป็นคอมพิวเตอร์ราคาถูก เอามาทำ media server หรือต่อกับ hardware ตัวอื่นๆ เป็น micro controller เลยก็มี

RPi นั้นมีส่วนประกอบที่แทบจะเป็นคอมพิวเตอร์ที่สมบูรณ์เลย ตัว RPi 2 ที่ผมได้มา เป็น System On Chip (SoC) ของ Broadcom BCM2836 ข้างในมี CPU ARM A7, GPU VideoCore IV, Ram 1GiB (แชร์กับ GPU), USB 1 port (แต่บน RPi 2 มี USB Hub ขยายเป็น 4 port ให้), HDMI เอาไว้ต่อจอ ขาดแค่ storage เท่านั้น ซึ่ง RPi 2 ก็มีช่อง micro sd เอาไว้ให้อยู่แล้ว การที่คอมพิวเตอร์จะทำงานได้ ก็ต้องมี OS เป็นตัวจัดการ การที่ไม่มี storage ในตัว ผมว่าเป็นข้อดีซะอีก เราสามารถเปลี่ยน OS หรือเตรียม OS ที่มีหลาย configuration ไว้ทำหรับงานต่างๆ ใน sd แต่ละอัน ถ้าต้องการใช้งานอันไหน ก็แค่ถอด sd ตัวเก่าออก แล้วเอาตัวใหม่ใส่เข้าไป แถมราคา sd ก็ถูกมากๆ


OS หลักของ RPi คือ Raspbian (น่าจะมาจากคำว่า Raspberry + Debian) โหลดได้จาก https://www.raspberrypi.org/downloads/ นอกจากนั้นยังมี OS เจ้าอื่นๆ ให้เลือกลงอีก แต่ผมยังไม่มีความรู้เกี่ยวกับ RPi เลย ก็เริ่มจาก Raspbian ก่อนละกัน

ไฟล์ที่โหลดมาได้จะมีนามสกุล img ก่อนจะนำไปใช้งาน ต้องทำการเขียนข้อมูลลงใน sd เสียก่อน โปรแกรมที่ใช้สำหรับ windows คือ Win32Disk Imager ถ้าเป็น mac ก็ใช้ ApplePi-Baker แทน

เสียบ sd เข้ากับคอมพิวเตอร์ sd ต้องมีขนาด 4GB ขึ้นไป แล้วเปิดโปรแกรม Win32 Disk Imager เลือกไฟล์ Raspbian

เลือก drive ของ sd ปกติถ้าเสียบ sd อันเดียว โปรแกรมจะเลือกให้อยู่แล้ว

กด Write แล้วรอสัก 5 นาที แนะนำให้ใช้ sd class 10 เพื่อความเร็วในการอ่านเขียน ราคา sd 8GB class 10 กับ class 4 ราคาต่างกันแค่หลักสิบ ถ้ามีอยู่แล้ว ใช้อันไหนก็ได้ แต่ถ้าซื้อใหม่ class 10 เท่านั้น

หลังจากเขียนไฟล์ลง sd เสร็จแล้ว ต่อจอ mouse กับ keyboard แล้วเสียบ sd เข้าไปที่ช่องด้านหลังบอร์ด RPi จากนั้นเสียสายไฟเข้าทาง micro usb


เรียบร้อย…

พอบูทเสร็จจะเข้าไปหน้า Raspberry Pi Software Configuration Tool ให้เลือก ข้อ 1.Expand Filesystem



sd อันนี้จะใช้ได้เต็มขนาด หลังจากการบูทครั้งต่อไป

ถ้าต้องการภาษาไทย ให้เลือกเมนู 4.Internationalisation Options

เลือก Change Locale

เลือก th_TH.UTF-8 UTF8

เลือก Finish

หลังจากบูทระบบใหม่ จะเข้ามาหน้า login ของ RPi ที่เหมือนๆ กับ linux ตัวอื่นๆ

login คือ pi
password คือ raspberry

ถ้าต้องการใช้งาน X Windows ทำได้โดยพิมพ์คำสั่ง startx

CPU ของ RPi มันช้ามากๆ ถ้าเทียบกับ PC ก็อย่าตั้งความหวังว่ามันจะลื่นเหมือน linux บน PC มันแค่พอใช้งานได้เท่านั้นแหละ

Raspbian มันก็คือ linux ที่ดัดแปลงมาให้ทำงานบน RPi ในการใช้งานจริง เราคงไม่ต่อ จอ mouse กับ keyboard ให้รกแน่นอน แค่ต่อสายแลนกับสายไฟสองเส้น แล้วใช้โปรแกรม putty ก็เข้าไปใช้งานได้เหมือนกัน

เปิดโปรแกรม putty แล้วใส่ ip ของ RPi ขั้นตอนการกำหนด ip ถ้าไม่ทำการ fixed ip ที่ RPi สามารถไปทำที่ router ได้ โดยกำหนด ip ผูกติดกับ mac address เลย

login คือ pi
password คือ raspberry

เท่านี้ก็ใช้งานได้แล้ว

 

เขียน htaccess ให้ข้ามใช้ SSL บางหน้า

เดี๋ยวนี้เว็บไซต์ส่วนใหญ่ที่ผมเขียน จะขอ SSL ติดไปด้วยเสมอ เวลาเข้าเว็บที่มี SSL แล้ว เราต้องเขียน htaccess เพื่อบังคับให้ใช้งานผ่าน https ตามนี้

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://www.cmdevhub.com/$1 [NC,R=301,L]

จากข้างบน บรรทัดสุดท้ายจะเป็นการเขียนบังคับให้ทุก request ที่เข้ามา ถูก redirect ไปที่ https ทั้งหมด

แต่บางครั้ง ถ้าเราต้องการเขียนโปรแกรมให้เรียกข้อมูลผ่าน curl จะมีปัญหาทันที เราจะไม่สามารถเรียกผ่าน https ได้ วิธีแก้ปัญหาก็คือ เขียนเงื่อนไขให้ยกเว้นบาง url หรือบางไฟล์ ให้ผ่านทาง http ปกติ แค่นี้ก็จะสามารถใช้ curl ได้แล้ว

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond http://www.cmdevhub.com/loaddata.php [NC]
ใช้งาน URL ด้านบนผ่าน http เท่านั้น

RewriteCond %{SCRIPT_FILENAME} \/load\.php [NC]
ไฟล์ load.php ใช้งานได้โดยไม่ต้องผ่าน https อยู่ใน directory ใดก็ได้
RewriteRule ^(.*)$ https://www.cmdevhub.com/$1 [NC,R=301,L]

เท่านี้เราก็แก้ปัญหาเรียก curl ผ่านเว็บที่ใช้ https ได้แล้ว หวังว่าจะมีประโยชน์บ้างนะครับ

เซ็ต virtual host ใน xampp

หลังจากลง xampp แล้ว ถ้าเราต้องการเพิ่ม virtual host โดยให้ทำงานแบบแยกพอร์ท เราสามารถแก้ไขไฟล์ htconf ได้ โดยเพิ่ม

บอกว่าจะใช้พอร์ทไหนโดยเขียน จากตัวอย่างบอกว่าจะใช้พอร์ท 8001

Listen 8001

จากนั้นตั้งชื่อ host และบอกว่าไฟล์เก็บไว้ที่ไหน

<VirtualHost localhost:8001>
DocumentRoot “e:\www\test”
</VirtualHost>

เสร็จแล้วให้ทำการ save และทำการ restart apache โดยการกด stop และ start ใน xampp control panel

หลังจากเริ่ม apache ใหม่แล้ว ให้ทดลองเปิด browser แล้วพิมพ์ localhost:8001

ถ้าหากไม่มีปัญหาก็จะสามารถใช้งานไฟล์ที่อยู่ใน directory ได้ ถ้าหากเกิด error 403 แสดงว่าไม่ได้ตั้งให้ apache ใช้งาน directory อื่นได้ ให้เราไปเซ็ตค่าที่

<Directory />
AllowOverride none
Require all denied
</Directory>

เปลี่ยนเป็น

<Directory />
AllowOverride all
Require all granted
</Directory>

เท่านี้ก็จะสามารถเรียก directory ใดๆ จากในเครื่องได้แล้ว

Payment Gateway ของธนาคารในประเทศไทย

ผมเคยได้รับโปรเจคให้เขียนโปรแกรมขายของแล้วในส่วนของการจ่ายเงิน ให้ใช้ Payment Gateway ที่เป็นของธนาคารโดยตรงเลย เนื่องจากว่าค่าธรรมเนียมถูกกว่าของเว็บที่เป็นตัวกลางเช่น Paypal, Paysbuy หรือ 2C2P ก็เลยมีโอกาสได้ลองติดต่อกับธนาคารและมีข้อมูลมาแชร์กันนิดหน่อยครับ

ก่อนอื่นก็อธิบายคำว่า Payment Gateway ก่อน เว็บไซต์ที่มีการจ่ายเงินออนไลน์ตั้งแต่เว็บขายของ ไปจนถึงสายการบิน ที่มีการจองผ่านหน้าเว็บไซต์ ขั้นตอนสุดท้ายของการทำรายการก็คือการจ่ายเงิน ถ้าเป็นเมื่อก่อน ผู้ซื้ออาจจะต้องออกไปโอนเงินที่ธนาคาร หรือดีหน่อยก็เดินไปจ่ายเงินที่ 7 ระบบ Payment Gateway จึงเป็นช่องทางให้ผู้ซื้อสามารถชำระเงินจากคอมพิวเตอร์ได้เลยเพิ่มความสะดวกสบายให้กับผู้ซื้อมากขึ้น ระบบ Payment Gateway มี 2 รูปแบบคือ เชื่อมต่อกับธนาคารโดยตรง หรือ ผ่านเว็บไซต์ที่เป็นตัวกลาง เช่น Paypal ซึ่งแต่ละแบบก็มีข้อดีข้อเสียต่างกัน ตามที่เคยศึกษามาดังนี้

Continue reading

ค่า IPN ที่ได้จาก paypal

เก็บค่าไว้ดูเฉยๆ ครับ ถึงแม้ว่า Paypal จะมี REST API ออกมาแล้ว แต่ถ้าทำบนเว็บ ผมก็ยังชอบ Classic API มากกว่า อย่างน้อยมัน Redirect ไปที่ Paypal เลย ทำให้ดูเหมือนว่าเราจ่ายเงินกับ Paypal จริงๆ ทีนี้ตอนส่งค่ากลับ เราควรจะส่งค่าไปที่ IPN เพื่อทดสอบว่าที่เราจ่ายเงินไปเมื่อกี้ผ่านหรือไม่ลักษณะก็ประมาณในรูปนี้

รายละเอียดเพิ่มเติม อ่านได้จากตรงนี้เลย

https://developer.paypal.com/docs/classic/ipn/gs_IPN/

ค่าที่ส่งมาก็ตามนี้เลย

Array ( [0] => mc_gross=10.74 [1] => protection_eligibility=Ineligible [2] => payer_id=7AKYXA62JHJ28 [3] => tax=0.00 [4] => payment_date=01%3A26%3A48+Jun+29%2C+2014+PDT [5] => payment_status=Completed [6] => charset=windows-1252 [7] => first_name=POP [8] => mc_fee=0.61 [9] => notify_version=3.8 [10] => custom=1%2C+popcm82%40gmail.com [11] => payer_status=verified [12] => business=shikimasan-facilitator%40gmail.com [13] => quantity=1 [14] => payer_email=popcm82%40gmail.com [15] => verify_sign=An5ns1Kso7MWUdW4ErQKJJJ4qi4-AZ7COGevOZwhzP.I7xXBZluVjWBi [16] => txn_id=90604886TJ142822G [17] => payment_type=instant [18] => last_name=EYE [19] => receiver_email=shikimasan-facilitator%40gmail.com [20] => payment_fee=0.61 [21] => receiver_id=E6DSF6LCZKA6Y [22] => txn_type=web_accept [23] => item_name=SBOBET222+registeration [24] => mc_currency=USD [25] => item_number= [26] => residence_country=US [27] => test_ipn=1 [28] => handling_amount=0.00 [29] => transaction_subject=1%2C+popcm82%40gmail.com [30] => payment_gross=10.74 [31] => shipping=0.00 [32] => merchant_return_link=click+here [33] => auth=AAPg-EApVQ6-.mrEUuFjCtr5Ab7MQlltZSL.791sCcItxm-uIk5xClVtjyHWodt9XDb.0c29pZH9bjdstlxW8xQ ) The response from IPN was: INVALID

Windows 7 ISO จากเว็บ Microsoft

Windows 7 ถือว่าเป็น OS ที่ดีมากตัวหนึ่งของ Microsoft คอมรุ่นใหม่ๆ ไม่ว่าจะเป็น Desktop หรือ Notebook เดี๋ยวนี้โดนบังคับให้ลง Windows 7 ขึ้นไปแล้วทั้งนั้น (จริงๆ บังคับที่ Vista แต่ตัวนั้นมันเป็น 7 beta เลยไม่นับละกัน)

Microsoft ใจดี แจก Windows 7 ให้โหลดกันไปใช้งานได้ 30 วัน ถ้าอยากใช้งานต่อก็หา CD Key มาใส่กันเองนะ ไฟล์ ISO นี้สามารถใช้ Windows 7 USB/DVD Download tools เขียนลงแผ่น DVD หรือใส่ Flash drive ได้เลย

 

โหลดแล้ว อย่าลืมซื้อ CD Key แทนใส่ด้วยนะ

Regular expression ที่ผมใช้บ่อยๆ

แอบอู้มานาน เอาของที่ใช้กันอยู่ทุกวัน มาแจกให้

โค๊ดพวกนี้ผมจะใช้ใน javascript นะ ถ้าเอาไปใช้กับภาษาอื่นๆ ก็เปลี่ยนแปลงนิดหน่อย ก็ได้ละ

var emailpattern = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
var usernamepattern = /^([a-zA-Z0-9_]{6,16})+$/;
var moneypattern = /^([1-9][0-9]{0,10}|[1-9][0-9]{0,10}.[0-9]{2})$/;
var daypattern = /^[2][0-9]{3}\-[0-9]{1,2}\-[0-9]{1,2}$/;
var timepattern = /^([0-9]{1,2}:[0-9]{1,2})|([0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})$/;
var passwordpattern = /^(?=.*\d).{6,12}$/;

เสร็จอย่างไว

ตัวเลขปวดหัวๆ กับ Javascript

สวัสดีเพื่อนๆ ช่วงนี้ทำงานหลายอย่าง ไม่มีเวลาเข้ามาเขียนอะไรเลย รอบนี้เอาสั้นๆ ละกันเนอะ

ตอนนี้ผมก็เขียนเว็บที่มีตัวเลขมาเกี่ยวข้องนิดหน่อย จริงๆ แล้วก็ไม่ค่อยถูกกับตัวเลขเท่าไหร่หรอก แต่ในเมื่อเขาขอมาผมก็จัดไป (แต่ก็ยังไม่ 100% ซะที)

เพื่อนที่เคยเขียนเว็บมาคงมีปัญหาตัวเลขกับ Javascript กันมาพอสมควร ผมขอยกตัวอย่างง่ายๆ ที่เจอกันบ่อยๆ นะครับ

1. ช่องใน textbox เป็นค่าว่าง แล้วพอนำไปคำนวนตัวเลข จะกลายเป็น NaN (Not a Number) ซะ ทำให้ค่าที่ออกมาผิดไปหมดเลย วิธีการแก้ปัญหาก็แสนจะง่ายคือ เอาค่าไป OR กับ 0 (ศูนย์) ซะ แค่นี้ก็แก้ปัญหาได้แล้ว ตัวอย่างโค๊ดก็แบบนี้

var number = parseFloat(jQuery("#number").val());
// แบบนี้ ถ้าหากเป็นค่าว่าง จะมีปัญหา NaN ก็แก้แบบนี้ซะ

var number1 = parseFloat(jQuery("#number1").val()) || 0;
// แบบนี้ ถ้าเป็นค่าว่างก็จะกลายเป็น 0 แทน เท่านี้ก็แก้ปัญหาได้แล้ว

2. ทศนิยมใน Javascript มันเพี้ยน หรือต้องการทศนิยมแค่ 2 ตำแหน่ง ไม่ยากเลย ใช้คำสั่ง toFixed() ซะ แค่นี้ก็จะแสดงทศนิยมตามที่ต้องการได้แล้ว ตัวอย่างเช่น


var number = 123.456789;
alert(number); // แสดงผล 123.456789
alert(number.toFixed(2)); // แสดงผลแค่ 123.45

3. ป้อนข้อมูลเข้ามามีเครื่องหมาย , ด้วย แต่ตอนที่เอาไปคำนวนต้องตัด , ออกไปก่อน บางที user ไม่อยากแก้ (ขี้เกียจ) หรืออาจจะไม่ทันได้แก้ หลงลืมได้ ไม่ว่ากัน เราก็เขียนกันไว้ก่อนซะ ง่ายๆ เลย ใช้ regular expression ซะ แค่นี้เราก็ตัดเครื่องหมาย , ออกได้แล้ว ผมเขียนเป็น function ใหม่ละกัน ไม่ต้องไปสร้างเป็น prototype ให้มันยุ่งยากเนอะ

function makeNumber(obj) {
   jQuery("#"+obj.id).val(obj.value.replace(/[,]/g,""));
}

<input type=”text” name=”number” id=”number” value=”0″ onChange=”makeNumber(this);”>
อ่าเอาแค่นี้ก่อนละกัน ยิ่งเขียนยิ่งรั่วแหละ เดี๋ยวเคลียงานเสร็จแล้วจะมาแก้ไขให้ดูดีกว่านี้ละกันครับ แล้วเจอกันใหม่ 🙂

เอา index.php ออกจาก URL ใน codeigniter

ช่วงนี้เริ่มเปลี่ยนมาใช้ codeigniter ได้พักใหญ่ๆ แล้ว แต่ก็ต้องคอยค้นหาวิธีเอา index.php ออกจาก URL ตลอด ซึ่งก็ไม่พ้น google นี่แหละ ตอนนี้ก็เลยเอามาลงไว้เผื่อคราวหน้าจะได้ไม่ต้องไปหาที่ไหนอีกละ

ขั้นตอนแรก สร้างไฟล์ .htaccess ใส่โค๊ดตามนี้

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /

 RewriteCond %{REQUEST_URI} ^system.*
 RewriteRule ^(.*)$ /index.php?/$1 [L]

 RewriteCond %{REQUEST_URI} ^application.*
 RewriteRule ^(.*)$ /index.php?/$1 [L]

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
ErrorDocument 404 /index.php
</IfModule>

จากนั้นแก้ไฟล์ application/config/config.php

หาบรรทัดที่เขียนว่า


$config['index_page'] = 'index.php';

ให้เอา index.php ออกไป

แค่นี้ก็เสร็จแล้ว ขอให้สนุกกับการเขียนนะครับ