เมนู

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

เริ่มต้นกับ Pinguino



วันนี้ผมจะมาแนะนำ platform สำหรับพัฒนาไมโครคอนโทรลเลอร์ของ PIC mcu ที่มีความง่ายเหมือนกับ Arduino นะครับ ซึ่งเจ้า platform ตัวนี้มีชื่อว่า Pinguino ซึ่งใช้ PIC mcu ที่มีโมดูล USB ภายในมาเป็นตัวสื่อสารกับ PC เพื่อโปรแกรม .hex ไฟล์ลงไปในตัว mcu โดยที่ตัว PIC mcu เองจะมี bootloader อยู่ภายในคอยสื่อสารและรับข้อมูลมาเขียนลง Flash เอง ก็เหมือนกับ Arduino นั่นแหละครับเพียงแต่ไม่ต้องมี usb-to-serial อย่างพวก FTDI หรือ CH3404 นั่นเองทำให้ออกแบบง่ายขึ้นเยอะ

โดย Pinguino จะมีทั้ง mcu 8 bit และ 32 bit ทางด้าน 8 bit จะเป็นเบอร์ PIC18F2550, PIC18F4550, PIC18F45K50 และอีกหลายๆเบอร์  ส่วนทางด้าน 32 bit จะมีเบอร์ PIC32MX250F128B, PIC32MX270F128B, PIC32MX795F512L และอีกหลายตัวเลือก ในบทความนี้ผมเลือกใช้ PIC18F45K50 เพราะใช้ไฟ 5 V. , มี internal oscillator ที่มีความแม่นยำสูง ทำให้สามารถทำ application USB โดยไม่ต้องต่อ crystal ข้างนอก ซึ่งก็จะประหยัดไปได้อีก และขา I/O ที่ปกติต้องต่ออยู่กับ crystal ก็จะว่างสามารถนำมาใช้งานเพิ่มได้อีก และสุดท้ายเจ้า PIC18F45K50 นั้นจะใหม่กว่า PIC18F4550 แถมยังราคาถูกกว่าอีกด้วยครับ


            สำหรับ hardware ผมได้ออกแบบให้คล้ายกับ Arduino UNO มากที่สุดเพื่อที่จะได้ใช้กับ shield ต่างๆที่มีขายอยู่มากมาย แต่ด้วยข้อจำกัด และความแตกต่างระหว่าง PIC18F45K50 กับ ATMEGA328P จึงทำได้แค่ใกล้เคียงไม่สามารถแทนกันได้ 100% แล้วเดี๋ยวเราจะค่อยๆมาดูกันครับว่า Pinguino สามารถทำได้ขนาดไหน

รูปที่ 1 schematic
ข้างบนนี้คือ schematic ของ board Pinguino 8 ครับ

รูปที 2 Board Pinguino 8

ทางด้านซ้ายนี้คือหน้าตาของ board ครับ
ใช้ PIC18F45K50 ตัว 40 ขาครับ หลังจากเชื่อมต่อ USB แล้วยังมีขา I/O อีกเหลือเฟือเลยครับ
ราคาก็ใกล้เคียงกับตัว 28 ขาอีกด้วยครับ











รูปที่ 3 อีกมุมนึง
         Crystal ไม่ได้ใช้ครับ ใช้ internal RC แทนครับ แต่สามารถเพิ่ม Crystal ภายหลังได้กรณีต้องการใช้กับ mcu ตัวเก่าเช่น PIC18F4550

         ทางด้าน software พัฒนาเราสามารถใช้ตัว IDE ของ Pinguino เองในการเขียน firmware ส่วนตัว compiler นั้นจะเป็น SDCC สำหรับ 8 bit mcu ซึ่งเราสามารถไปโหลดได้ที่ www.pinguino.cc ครับ แล้วเลือกไปที่แท็บ download จากนั้นก็โหลดตัวติดตั้งสำหรับ windows มา

หมายเหตุ 1: ในขณะที่เขียนบทความนี้ทาง pinguino.cc มี IDE V.11 ที่เป็นตัว stable อยู่ และกำลังทดสอบ IDE V.12 ครับ ตัว installer ที่โหลดมานั้น เมื่อจะติดตั้งต้องต่อ internet ด้วยนะครับ เมื่อคลิ้กติดตั้งไปแล้ว สามารถเลือกได้ว่าจะติดตั้ง IDE V.11 หรือ IDE V.12 หรือทั้งสองตัวก็ได้ โดยตัวติดตั้งจะไปโหลดไฟล์ IDE, Library, compiler, Python 2.7 มาไว้ในคอมพิวเตอร์ของเราแล้วติดตั้งให้ครับ

หมายเหตุ 2: โดยส่วนตัวผมลองติดตั้งตาม หมายเหตุ 1 แล้วแต่ไม่สำเหร็จ ทั้ง IDE V.11 และ IDE V.12 เลย ทดลองเปลี่ยนเครื่องคอมพิวเตอร์ที่มี Windows 7 32 bit ก็ฟลุกติดตั้ง IDE V.11 ได้ครั้งเดียว แต่ตัว IDE V.12 นี่ไม่ได้เลยครับ :<  แล้วตัวติดตั้งเองทุกครั้งที่ลองติดตั้งใหม่ มันก็พยายามไปโหลดไฟล์ต่างๆมาใหม่ ทั้งๆที่ไฟล์ทุกอย่างก็โหลดมาหมดแล้ว ค่อนข้างเสียเวลาครับ

            อีกทางเลือกในการติดตั้ง Pinguino IDE ที่ผมลองแล้วใช้ได้ ง่ายด้วย คือใช้ตัว installer เวอร์ชั่นเก่าที่ตอนนี้ทาง pinguino.cc เอาออกไปไว้ไหนแล้วก็ไม่รู้ แต่ผมมีเซพเก็บไว้แล้วผู้อ่านสามารถโหลดไปติดตั้งได้เลยครับจากลิ้งค์ข้างล่างนี้นะครับ


โดยตัว installer นี้ก็ต้องต่อ internet ในตอนติดตั้งนะครับแล้วมันจะไปโหลดไฟล์ที่จำเป็นมาให้ ผมทดลองติดตั้งกับคอมพิวเตอร์หลายเครื่องแล้วใช้งานได้ทุกครั้งครับ และถ้ามีไฟล์ต่างๆอยู่ในโฟลเดอร์เดียวกันกับตัวติดตั้งอยู่แล้วมันก็รู้และไม่ไปโหลดมาใหม่อีกครับ ง่ายมากเลย
            หลังจากติดตั้งตัว IDE เสร็จแล้ว เมื่อเราเปิดโปรแกรมขึ้นมาก็จะมีหน้าตาสวยงามดังรูปที่ 4 จากนั้นคลิ้กเลือก New ก็จะมีไฟล์ที่มีฟังก์ชั่น setup() และ loop() มาให้เราเสร็จสรรพพร้อมเริ่มต้นเขียน
โปรแกรมกันเลยครับ
รูปที่ 4 หน้าตา IDE


            และโปรแกรมแรกจะเป็นอะไรไปไม่ได้นอกจากไฟกระพริบ ใช่ไม๊ครับ โดยเราเริ่มจากกำหนดขาที่ต่ออยู่กับ LED ให้เป็น output ซึ่งเรากำหนดเพียงครั้งเดียวเราจึงควรกำหนดในฟังก์ชัน setup() จากนั้นเราก็จะสั่งให้ขาเอ้าพุตนั้นเป็น high เพื่อให้ LED ติดสว่างและต้องหน่วงเวลาไว้เพื่อให้เราสามารถมองเห็นการติดดับได้ จากนั้นจึงสั่งขาเอ้าพุตเดิมให้เป็น low เพื่อให้ LED ดับและก็ต้องหน่วงเวลาไว้เช่นกัน แล้วจึงวนกลับไปสั่งให้ LED ติดสว่างอีก วนทำงานอยู่อย่างนี้ไปเรื่อยๆ ดังนั้น code ส่วนนี้จึงควรเขียนในฟังก์ชัน loop() ตัวอย่างโค้ดอยู่ข้างล่างนี้ครับ



 void setup() {  
   // put your setup code here, to run once:  
   pinMode(USERLED,OUTPUT);  
 }  
 void loop() {  
   // put your main code here, to run repeatedly:  
   digitalWrite(USERLED, HIGH);  
   delay(300);  
   digitalWrite(USERLED,LOW);  
   delay(300);  
 }  

         หลังจากเขียนโค้ดเสร็จแล้วควรจะ save เก็บให้เรียบร้อยซะก่อน จากนั้นเราก็มาเลือก mcu ว่าเป็น 8 bit หรือ 32 bit ใช้ bootloader ใช่ไม๊ version ไหน และ mcu เบอร์อะไรแน่ สำหรับ board Pinguino 8 นั้น จะเป็น 8 bit mcu เบอร์ PIC18F45K50 และใช้ bootloader version 4.15  เมื่อเราเลือกถูกต้องแล้วก็สามารถกด compile โค้ดได้ซึ่ง Pinguino จะ compile เร็วกว่า Arduino มาก( อันนี้ชอบมาก ) หลังจาก compile เสร็จแล้วก็จะมี pop-up ขึ้นมาถามว่าจะโปรแกรมลงบอร์ดเลยหรือเปล่า
ถ้าต่อบอร์ดไว้อยู่แล้ว ให้กดปุ่ม Reset บนบอร์ดก่อนครับ RUN LED ก็จะกระพริบถี่ๆเพื่อบอกให้เรารู้ว่า mcu กำลังอยู่ในโหมด bootloader( ตอนเริ่มจ่ายไฟให้กับบอร์ด mcu จะไม่เข้าโหมด bootloader นะครับ จะเริ่มทำงานที่ user program ทันที ถ้าไม่มี user program อยู่ก็จะไม่มีอะไรเกิดขึ้นให้เราเห็น ต้องกดปุ่ม RESET ก่อน mcu ถึงจะเข้าสู่โหมด bootloader ) เราก็สามารถกดโปรแกรมบนคอมพิวเตอร์ได้เลยครับ ( ไม่ต้องรีบร้อนนะครับ mcu จะยังคงอยู่ในโหมด bootloader ตราบเท่าที่เรายังไม่โปรแกรมลงไป ) เมื่อเราโปรแกรมสำเร็จแล้วก็จะเห็น RUN LED( ดวงเดียวกับ USER LED ครับ เมื่อเวอร์ชันก่อนใช้ชื่อ RUN LED ตอนหลังเปลี่ยนมาเป็น USER LED แต่ RUN LED ก็ยังใช้ได้นะ ) กระพริบช้าๆตามที่เราเขียนเอาไว้เลยครับ ลองดูวิดีโอกันก่อนครับ


   
           โค้ดตัวอย่างข้างบนเขียนในแบบ Arduino Style ใน Pinguino สามารถเขียนให้ง่ายกว่านี้อีกครับลองดูโค้ดต่อจากนี้เทียบกันดูครับ


 void setup()  
 {  
   // initialize the digital pin USERLED as an output.  
   pinMode(USERLED, OUTPUT);     
 }  
 void loop()  
 {  
   toggle(USERLED);             // alternate ON and OFF  
   delay(300);                     // wait for 300ms  
 }  

         อีกแบบหนึ่งสำหรับคนที่คุ้นเคยกับการเขียนแบบกำหนดค่าใน register โดยตรงก็สามารถทำได้แบบนี้ครับ

 void setup()  
 {  
   // initialize the digital pin USERLED as an output.  
   TRISAbits.TRISA4 = 0;     
 }  
 void loop()  
 {  
   LATAbits.LATA4 = 1;             // Turn LED on  
   delay(300);                 // wait for 300ms  
      LATAbits.LATA4 = 0;             // Turn LED off  
   delay(300);                 // wait for 300ms  
 }  

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

http://wiki.pinguino.cc/index.php/6_ways_to_blink_the_built-in_Led