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

การใช้ KWL

การสอนเด็กโดยใช้แผนภาพ (Diagram) เป็นวิธีที่มีประสิทธิภาพมาก ทำให้เขาเข้าใจเรื่องราวได้ง่ายและเร็ว คนอธิบายเองก็ไม่สับสนด้วย และแน่นอนว่าเขาได้รับการศึกษามาแล้วย่อมต้องมีความรู้ติดตัวอยู่บ้าง การไปสอนเรื่องราวที่ซ้อนทับกับสิ่งที่เราเรียนมาจากโรงเรียนแล้ว หากคุยกันไม่ดี อาจทำให้เด็กสับสนได้ ผมมีวิธีหนึ่งที่คิดว่าช่วยลดความสับสนได้คือการใช้ ตารางที่เรียกว่า KWL

KWL มาจากคำสามคำคือ

K = Known เป็นเรื่องที่เด็กได้เรียนมาแล้ว ทราบมาแล้ว
W = Want to know / Need to Know เป็นหัวเรื่องที่เราอยากจะเสริมเข้าไป
L = Learned บทสรุปว่าวันนี้ได้เรียนรู้อะไรไปบ้าง

วิธีการสร้างก็ง่าย ๆ เลย คือทำตาราง 3 คอลัมน์ขึ้นมากำหนดชื่อไว้เป็น K , W, L ตามลำดับ แล้วก็เริ่มกรอกข้อมูลเริ่มต้นจาก K ก่อน ตามด้วย W คือส่ิงที่เราต้องการสอนเขาเพิ่มเติม และสุดท้ายคือ L หรือผลของการสอนในครั้งนั้น อาจจะได้หรือไม่ได้ทั้งหมดก็ไม่เป็นไร

KWL
.........
.........
.........


ยกตัวอย่างเช่น ไฟฟ้าเบื้องต้น

KWL
1. โลหะนำไฟฟ้าได้
2. กระแสไฟฟ้าคือการไหลของประจุไฟฟ้าในวงจรไฟฟ้า
3. ประจุไฟฟ้าคือคุณสมบัติอย่างหนึ่งของสสารมีสองประเภทคือ + และ -
4. ประจุไฟฟ้าเหมือนกันจะผลักกัน ต่างกันจะดูดกัน
5. อิเล็กตรอน โปรตรอน
1. โครงสร้างอะตอม
2. การมีประจุไฟฟ้าเป็นคุณสมบัติพื้นฐานของอนุภาคย่อยในอะตอม
3. วัตถุหรือสสารหากมีิอิเล็กตรอนเกินจะมีประจุบวก
4 . การไหลของประจุทำให้เกิดประโยชน์หลายอย่าง เช่น แสงสว่าง ความร้อน 
...

Physical Programming ด้วย Scratch 1.4 บน Raspberry Pi ตอน แนะนำ Remote Sensors Protocol

ก่อนหน้านี้ได้เขียนเรื่องราวการใช้ประโยชน์จาก GPIO Server เพื่อให้ Scratch 1.4 ติดต่อกับ GPIO Pin ของ Raspberry Pi มาแล้ว นับว่าเป็นการขยายขอบเขตการใช้งาน Scratch 1.4 ออกไปได้ดีทีเดียว แต่ก็ยังมีข้อจำกัดอยู่ที่การรับค่าจาก GPIO Pin โดย Scratch 1.4 นั้นรับค่าได้เพียงสองสถานะคือ 1 (on) กับ 0 (off) เท่านั้น (ความจริงมีเรื่องอื่นได้แก่ Camera, IP, และ  PWM อีก ในส่วนของ PWM เป็น software PWM ซึ่งใช้ประโยชน์ไม่ค่อยได้มากนัก ) การใช้งานจึงค่อนข้างจำกัดอยู่

โชคดีที่ทางผู้พัฒนา Scratch  ได้สร้างสิ่งที่เรียกว่า Remote Sensors Protocol ไว้ ทำให้ Scratch 1.4 สามารถสื่อสารได้กับโปรแกรมอื่นได้ ซึ่งมีประโยชน์ตรงที่ทำให้ Scratch 1.4 สามารถยืมความสามารถจากโปรแกรมอื่น หรือโปรแกรมที่พัฒนาขึ้นมาเองได้ ซึ่งเป็นการขยายความสามารถออกไปได้มากกว่ากว่าการใช้ GPIO Server อย่างเดียว และในบทความตอนนี้จะใช้ Protocol นี้ทำงานร่วมกับโปรแกรมที่พัฒนาด้วยภาษา Python ครับ

รู้จักกับ Remote Sensors Protocol

1. การเปิดใช้งาน

การเปิดใช้งาน Protocol นี้ต้องอาศัย sensor value block หรือ sensor  block ซึ่งอยู่ในกลุ่ม Sensing Blocks



โดยการเลื่อนเมาส์ไปวางบน Block อันใดอันหนึ่ง แล้วทำการคลิ๊กขวา จะเห็น popup menu ดังภาพ แล้วเลือกรายการ enable remote sensor connections



 แล้วจะได้พบกับ message windows ดังภาพ คลิ๊ก OK เพื่อปิดหน้าต่าง



หลังจากนี้ Scratch 1.4 จะทำการเปิิดพอร์ตสื่อสาร หมายเลข 42001  ขึ้นมาเพื่อรอการสื่อสารจากโปรแกรมอื่น


2. โครงสร้างข้อความ

การสื่อสารระหว่างโปรแกรมอื่นกับ Scratch 1.4 จะใช้การส่งข้อความไปมาระหว่างกัน โดยข้อความนั้นแบ่งเป็นสองส่วนดังภาพ




ส่วนที่เป็น Message Length จะมีความยาวคงที่คือ 4 Bytes โดยจะบรรจุค่าความยาวของ Message หรือข้อความจริงไว้ และส่วนที่เหลือจะเป็นส่วนที่เก็บข้อความที่ใช้จริง ข้อความที่ใช้ได้คือ

1. ข้อความคำเดียว (single word string) เช่น cat ,book-1, hello, etc
2. ข้อความที่มีหลายคำ โดยต้องเขียนไว้ในเครื่องหมายคำพูด เช่น "hello world", "sing a song", etc
3. ตัวเลข 1,2,3,-4.0,-1200, etc
4. ค่าทางตรรกะ คือ true , false


3. Block ที่ใช้ในรับ-ส่งข้อความ


3.1 รับข้อความจากโปรแกรมอื่น



 เช่น


หมายถึง เมื่อ Scratch 1.4 รับข้อความ "cat" จากโปรแกรมภายนอก ให้ทำเสียง "meow"




3.2 ส่งข้อความออกไป



เช่น





เป็นการส่งข้อความ "I see a cat" ออกไปยังโปรแกรมข้างนอก

การสื่อสารระหว่าง Scratch 1.4 กับ Python 3.x

ทีมงานผู้พัฒนา Scratch  ได้ทำตัวอย่างการสื่อสารระหว่าง Scratch กับ Python ไว้แล้ว (ดูเพิ่มเติม)
แต่เป็นชุดคำสั่งที่ใช้งานได้กับ Python 2.x  ผมได้นำมาดัดแปลงนิดหน่อยเพื่อให้งานได้กับ Python3.x ดังนี้ (หากต้องการใช้งานกับ Python 2.X ท่านสามารถดาวน์โหลดได้จากที่นี่)

ScratchPy.py : (ดาวน์โหลด)

import socket
import time
from array import array
import struct

#reference to https://wiki.scratch.mit.edu/wiki/Communicating_to_Scratch_via_Python


class Py2Scratch14():
     def __init__(self,host='localhost',port=42001):
          #the first 4-byte of message contains size of the real message 
          
          self.prefix_len = 4
          self._port = port
          self._host = host
          self._socket = None
  
     def connect(self):
          try:
               self._socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
               self._socket.connect((self._host,self._port))
          except socket.error :
               self._socket = None
   
     def send(self,cmd):
          if self._socket is None :
               return
          n = len(cmd)
          #to create first 4 bytes
          a = array('u') #array of unicode
          a.append(chr((n >> 24) & 0xFF)) # first left most byte
          a.append(chr((n >> 16) & 0xFF)) # second byte
          a.append(chr((n >> 8) & 0xFF)) # third byte
          a.append(chr(n & 0xFF)) # forth byte
          self._socket.send(a.tostring() + cmd)
  
     def sendCMD(self,cmd):
          #this can be used with Python3
          if self._socket is None :
               return
          # first 4 bytes contains size of message 
               self._socket.send(len(cmd).to_bytes(4, 'big'))
          # then send the command to Scracth
               self._socket.send(bytes(cmd,'UTF-8'))
  
     def _read(self, size):
          """
          Reads size number of bytes from Scratch and returns data as a string
          """
          data = b''
          while len(data) < size:
               try:
                    chunk = self._socket.recv(size-len(data))
               except socket.error :
                     pass
          if chunk == '':
               pass
          data += chunk
          return data

     def _recv(self):
          """
          Receives and returns a message from Scratch
          """
          prefix = self._read(self.prefix_len) 
          msg = self._read(self._extract_len(prefix))
  
          #return prefix + msg
          return msg
  
     def receive(self):
          in_msg = self._recv().decode('UTF-8')  
          return self._parse(in_msg)
  
     def _extract_len(self, prefix): 
          """
          Extracts the length of a Scratch message from the given message prefix. 
          """
          return struct.unpack(">L", prefix)[0] 
  
     def _parse(self, msg):
          msg = msg.replace('"','')
          splited = msg.split(" ")
          if len(splited) == 2 :
               return (splited[0],splited[1],None)
          else:
               return (splited[0],splited[1],splited[2])
  
     def sensorupdate(self, data):
          """
          Given a dict of sensors and values, updates those sensors with the 
          values in Scratch.
          """
          if isinstance(data, dict):
               msg = 'sensor-update '
               for key in data.keys():
                    msg += '"%s" "%s" ' % (str(key), str(data[key]))
               self.sendCMD(msg) 
  
     def broadcast(self,msg):
          _msg = 'broadcast "'+msg+'"'
          self.sendCMD(_msg)  
  

ต่อไปนี้เราจะสามารถนำเอา  Python นี้ทำหน้าที่เป็นตัวกลางสื่อสารระหว่าง โปรแกรมอื่นที่เขียนด้วย Python กับ Scratch 1.4

ในตัวอย่าง

ตัวอย่าง

จะทดสอบโดยการสั่งให้ Sprite ใน Scratch หมุนตามเข็มนาฬิกา 360 องศา เมื่อได้รับข้อความว่า "rotate_right" หลังจากหมุนเสร็จก็ส่งข้อความ "finish" ไปบอก Python





Python code : test_scratch_01.py

from ScratchPy import Py2Scratch14

sc  = Py2Scratch14()
sc.connect()  # start connect to Scratch
sc.broadcast("rotate_right")
rcv = sc.receive()
if rcv[1] == 'finish' :
     sc.broadcast("rotate_left")


Scratch Script :




ขั้นตอนการทำงาน
1.  เปิดใช้งาน Remote Sensor Protocol ตามที่กล่าวมาข้างต้น
2. สร้าง Scratch script ตามตัวอย่าง
3. เขียน Python ตามตัวอย่าง บันทึกในชื่อ test_scratch_01.py
4. ใช้คำสั่ง python3 test_scratch_01.py




[ควบคุม Servo motor ด้วย REMOTE SENSORS PROTOCOL]

เริ่มเรียนรู้ Physical Programming ด้วย Scratch และ GPIO บน Raspberry Pi ตอนที่ 5

[ตอนที่ 1][ตอนที่ 2][ตอนที่ 3][ตอนที่ 4]

ตอนนี้จะเป็นตอนสุดท้ายสำหรับการเสนอตัวอย่างการใช้ GPIO Server ของ Scratch 1.4 บน Raspberry Pi แล้วครับ หลังจากนี้ก็จะเป็นเข้าสู่เรื่องการใช้ Remote Sensing Protocol ซึ่งเป็นการสื่อสารระหว่าง Scratch 1.4 กับ Python โปรแกรมครับ

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

สร้างสภาพแวดล้อม

กำหนดตัวละคร (Sprite)

1. Ball (Sprite1)





2. Jumper (Sprite2)



ตัวละครตัวนี้มีสองกริยา คือ idle state คือท่ายืนตรง  และ jumping state ใช้ชื่ออ้างอิงว่า breakdance-2 ใช้ชื่อในการอ้างอิงสำหรับ costume เป็น breakdance-1 และ breakdance-2 ตามลำดับ


3. Stage background 






หลังจากนั้นก็จัดวางตำแหน่งของตัวละครตามต้องการ ก็จะได้ออกมาดังภาพข้างล่าง





เขียน Script กัน

1. Ball  (Sprite1)

กำหนดทิศทางการเคลื่อนที่ 

Ball จะกลิ้งออกมาจากเวทีทางด้านขวามือ มุ่งไปสู่ด้านซ้าย โดยใช้การวน loop ร่วมกับการกำหนดทิศทาง





ระยะเวลาในการออกมาบนเวที (Stage) ของ Ball จะเป็นแบบสุ่ม ทำโดยการกำหนดการหน่วงเวลาไว้แบบสุ่มระหว่าง 1,2 หรือ 3 วินาที



ตรวจสอบการชน (collision detection

ในการเคลื่อนที่ของ Ball จะต้องมีการตรวจสอบการชนกับตัวละครตัวอื่นในที่นี้คือ Sprite2 หากมีการชนเกิดชึ้น

  • ผู้เล่นจะเสียคะแนนไป 1 คะแนน และ 
  • Ball จะเปลี่ยนทิศทางการเคลื่อนที่


Script ทั้งหมดในส่วนของการเคลื่อนที่ของ Ball มารวมกันจะได้






Script ทั้งหมดของ Ball (รวมการกำหนดตำแหน่งบน Stage และค่าเริ่มต้น)





2. Jumper (Sprite2)

กริยาเดียวที่ Sprite2 นี้กระทำคือการกระโดด การกระโดดทำได้โดยการเปลี่ยนตำแหน่งในแนวตั้ง ดังภาพ



การกระโดดจะโยงกับการเปลี่ยน costume ด้วย ดังนั้นเราจะเติม block ที่ช่วยการเปลี่ยน costume ของตัวละคร




นอกจากจะโยงกับการเปลี่ยน costume แล้ว การกระโดดจะเกิดขึ้นได้ก็ต่อเมื่อได้รับค่าจาก GPIO Pin โดยเราจะนำเอาความรุ้เรื่องการใช้ Push button switch จากตอนที่ 3 มาใช้ จะได้




Script ทั้งหมดสำหรับ Sprite2



ผลลัพธ์ 





ปล.

1. เอกสารการใช้งาน Scratch 1.4
2. Source code ของโครงงาน

เริ่มเรียนรู้ Physical Programming ด้วย Scratch และ GPIO บน Raspberry Pi ตอนที่ 4

[ตอนที่ 1][ตอนที่ 2][ตอนที่ 3][ตอนที่ 5]

จากตอนที่ 3 ผมได้แสดงให้เห็นวิธีการใช้ GPIO Pin ในรูปแบบของ output mode มาแล้ว มาในตอนนี้จะเพิ่มเติมเรื่องการใช้ใน input mode กันบ้าง

โครงงานนี้จะต่อยอดจากโครงงานเรื่อง LED ในตอนที่แล้ว โดยจะเปลี่ยนการเปิด-ปิด LED มาใช้ Push button switch แทนการใช้ Scratch Block

Push button switch ถือว่าเป็นอุปกรณ์ไฟฟ้าแบบหนึ่ง ใช้ในการตัดต่อวงจรไฟฟ้าเพื่อให้มีการจ่ายหรืองดจ่ายแรงดันไฟฟ้า



By Scwerllguy - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=4229777

สำหรับ GPIO Pin บน Raspberry Pi ใช้ในการส่งสัญญาณดิจิตอลเป็น ON หรือ 1 หมายถึงปล่อยแรงดันขนาด 3.3 V หรือ OFF หรือ 0 หมายถึวงดจ่ายแรงดัน แรงดันเป็น 0.0 V


เมื่อนำมา Push button switch มาทำงานร่วมกับ GPIO เราก็จะสามารถสร้างระบบตรวจสอบสถานะการกดหรือปล่อย switch ได้โดยการตรวจสอบสถานะของ GPIO ได้


ตามแผนภาพ GPIO 20 (สายสีเหลือง) ต่อเข้ากับขาด้านหนึ่งของ Push button switch และต่อสาย Ground (สายสีดำ) เข้ากับอีกด้านหนึ่ง ในภาวะปรกติจะไม่มีแรงดันไฟฟ้าผ่านในส่วนนี้ แต่เนื่องจาก Raspberry Pi มีการติดตั้ง pull up resistor มาด้วยแล้วทำให้เกิดข้อแม้ดังนี้

1. เมื่อกำหนดให้ mode ของ GPIO20 เป็น inputpullup (ดูรายละเอียดคำสั่งนี้ในตอนที่ 3) จะทำให้สถานะของ GPIO20 เป็น "ON"  หรือ "1" (ในทางตรงข้ามหากกำหนดเป็น inputpulldown ก็จะมีสถานะเป็น OFF หรือ 0)

2. เมื่อ switch ถูกกด จะเป็นการเชื่อมเส้นทางจาก GPIO20 ไปสู่ Ground จะส่งผลทำให้สถานะของ GPIO20 เปลี่ยนจาก ON ไปเป็น OFF  หรือ จาก 1 ไปเป็น 0

3. เมื่อยก switch ขึ้นสถานะของ GPIO20 ก็จะกลับมาเป็น ON ตามเดิม หรือ เปลี่ยนจาก 0 ไปเป็น 1








ด้วยวิธีการทำงานข้างต้นเราก็จะสามารถสร้างขั้นตอนการเปิด-ปิด LED ได้ดังนี้


Switch GPIO20 การสั่งการ
ไม่กด 1 ปิด LED
กด 0 เปิด LED



ส่วนการทำงานที่ใช้ในการเปิด - ปิด LED ผมจะใช้การทำงานตามแบบในโครงงานในตอนที่ 3

Scratch Script 







อยากจะแนะนำ Block สีน้ำเงินที่เห็นในภาพหรือวิดิโอสาธิตสักหน่อย Block นี้อยู่ในกลุ่ม Sensing Blocks (รุ่น 2.0 จะเป็นสีดำ) หน้าที่ของ Block นี้คือการรับค่าจาก GPIO Pin ของ Raspberry Pi

หากท่านคลิ๊กดูที่ Block นี้จะเห็น drop down menu แสดงตัวแปรเริ่มต้นอยู่จำนวนหนึ่ง ตัวแปรเหล่านี้มีไว้สำหรับใช้งานกับ PicoBoard ครับ ซึ่งไม่ได้ใช้งานในโครงการนี้ ก็มองข้ามไปได้

ในโครงงานนี้ตัวแปรที่ใช้ในการรับค่าจาก GPIO Pin จะมีชื่อ gpio20 ได้มาจากการใช้คำสั่ง config20inputpullup โดยทาง Scratch จะตั้งชื่อให้เองโดยเอา "gpio" รวมกับ GPIO Number ซึ่งผู้ใช้ไม่ต้องไปตั้งเอง ครับ ชื่อนี้จะถูกนำมาใช้กับ GPIO ที่ถูกกำหนด mode ให้เป็น input เท่านั้น และในตอนแรกเริ่มนั้น sensor value Block จะยังไม่รู้จักว่าเรากำหนด GPIO ไหนเป็น input ทำให้ Scratch ยังไม่แสดงชื่อให้เห็น ต้องทำการกระตุ้นโดยการคลิ๊กไปที่ block ที่ใช้คำสั่ง  config20inputpullup    ก่อน หลังจากนั้นก็ใช้งานได้



    

เริ่มเรียนรู้ Physical Programming ด้วย Scratch และ GPIO บน Raspberry Pi ตอนที่ 3

[ตอนที่ 1][ตอนที่ 2][ตอนที่ 4][ตอนที่ 5]

ตอนนี้จะแสดงให้เห็นตัวอย่างการใช้ Scratch 1.4 ที่มากับ Raspbian รุ่นล่าสุด ในการสร้าง Physical Programming กัน ครับ โดยผมจะอนุมานว่าท่านได้ทำความเข้าใจการใช้งาน Scratch มาจากตอนที่ 1 เรียบร้อยแล้วนะครับ

ตามที่กล่าวมาแล้วถึง GPIO Server ว่าจะช่วยให้ Scratch สามารถสื่อสารกับ GPIO Pin บน Raspberry Pi ได้ โดย GPIO Server จะคอยรับ "สาร" (message) จาก Scratch แล้วทำการ "เปิด" (on) หรือ "ปิด" (off)  GPIO Pin


การเปิด-ปิด GPIO Server 

ก่อนที่จะใช้คุณสมบัตินี้ได้ จำเป็นต้องทำการเปิดบริการเสียก่อน โดย

ทางเลือก 1 : ผ่านคำสั่งบน Menu Bar ของ Scratch ตามภาพ



ทางเลือก 2 : ใช้คำสั่ง "gpioserveron" เมื่อต้องการใช้บริการ หรือ "gpioserveroff" เมื่อต้องการยกเลิก โดยต้องพิมพ์คำสั่งนี้ใน Broadcast block  ดังภาพ




เราต้องทำการ เปิดบริการ GPIO Server ก่อนการเรียกใช้งานเสมอ ส่วนการปิดนั้นไม่จำเป็นต้องประกาศทุกครั้งหลังใชังานก็ได้ และเมื่อเปิดใช้ GPIO Server แล้ว Scratch จะจดจำไว้ และจะถูกเปิดใช้งานโดยอัตโนมัติในการใช้เรียกโครงงานมาใช้ครั้งต่อ ๆ ไป


ชุดคำสั่ง

1. กำหนด mode ของ Pin 


input mode :

config + pin number + in หรือ
input หรือ
inpullup หรือ
inputpullup หรือ
inpulldown หรือ
inputpulldown

output mode :

config + pin number + out หรือ
output  


** pin number ต้องใช้ BCM Numbering เท่านั้น 

ยกตัวอย่างเช่น หากเราต้องการกำหนดให้ Pin BCM Number ที่ 21 (Pin ตำแหน่งที่ 40) เป็น input mode ก็ใช้คำสั่ง 

config21in  หรือ config21input


ในกรณีที่มีการใช้ pull up resistor

config21inpullup หรือ config21inputpullup


ในกรณีที่มีการใช้ pull down resistor

config21inpulldown หรือ config21inputpulldown


2. กำหนดสถานะ (on/off)


gpio + pin number + on | off | high | low

เช่น 

gpio21on

gpio21off


3. การใช้ PWN 

จะใช้กับ output mode เท่านั้น และเป็น software PWM

การประกาศ

config + pin number + outputpwm 

เช่น

config21outputpwm 


การใช้งาน :

gpio + pin number + pwm + pwm number [0 ... 1024] 

เช่น

gpio21pwn512


ทดลองการใช้งาน

จะแสดงตัวอย่างโดยการใช้กับโครงงานเปิด-ปิด LED กันนะครับ ง่ายดี

เตรียมอุปกรณ์

ต่อ LED, Resistor และ GPIO Pin บน Raspberry Pi ตามภาพ ในตัวอย่างผมใช้ GPIO 21 หรือ Pin ตำแหน่งที่ 40 ต่อกับ ขา Anode ของ LED



สร้าง Scratch Script 






โครงงานนี้เป็นตัวอย่างที่แสดงให้เห็นว่า Scratch 1.4 บน Raspberry Pi สามารถสื่อสารกับโลกจริงผ่าน GPIO Pin ได้อย่างไร ในตอนต่อไปเราจะทดลองทำโครงงานที่ซับซ้อนขึ้น ครับ












เริ่มเรียนรู้ Physical Programming ด้วย Scratch และ GPIO บน Raspberry Pi ตอนที่ 2

[ตอนที่ 1][ตอนที่ 3][ตอนที่ 4] [ตอนที่ 5]

ผมได้เกริ่นให้ท่านรู้จักกับ Scratch มาแล้วอย่างคร่าว ๆ ในตอนที่ 1  ในตอนที่ 2 จะกล่าวถึงเรื่อง Physical Programming กันละ ครับ

อะไรคือ Physical Programming

เริ่มต้นที่ความหมายของ Physical Programming กัน หากท่านค้นหาภาพโดยใช้คำค้นว่า "physical programming" ใน Google  ท่านจะได้ภาพออกมามากมาย หากสังเกตุดูแล้ว ภาพที่สื่อถึงกิจกรรมการเขียนโปรแกรมคอมพิวเตอร์แบบที่มีคนกำลังพิมพ์คำสั่งอยู่หน้าคอมพิวเตอร์นั้นมีน้อยมาก ดูๆ ไปแล้วจะเหมือนกับการทำพวกงานประดิษฐ์ หรือ ค่ายวิทยาศาสตร์เสียมากกว่า


แผนภาพ 1 ความสัมพันธ์ระหว่างส่วนต่าง ๆ ใน Physical Programming

จากแผนภาพที่ 1 ได้พยายามแสดงให้เห็นความหมายของ Physical Programming ซึ่งมองโดยรวมแล้ว Physical programming คือการสื่อสารระหว่างโลกจริงกับโลกเสมือนโดยผ่านคอมพิวเตอร์นั่นเอง  วิดีโอข้างล่างนี้เป็นตัวอย่างที่แสดงให้เห็นว่าในโลกจริงนั้นเราสามารถนำเอาวัสดุหลายอย่างรอบตัวเราที่มีคุณสมบัตินำไฟฟ้ามาใช้งานได้ โดยไม่จำเป็นต้องเป็นอุปกรณ์ทางอิเล็กทรอนิกส์เสมอไป






จุดหนึ่งที่น่าสนใจของ Physical Programming  คือ การเพิ่มบทบาทของผู้ทำงานที่ไม่ได้จำกัดอยู่กับนักคอมพิวเตอร์เท่านั้น แต่มันขยายวงออกไปยัง นักออกแบบ นักประดิษฐ์ วิศวกร  เกษตกร ครู เด็กนักเรียน หรือคนที่สนใจทั่วไป อีกด้วย และหากท่านต้องการนิยามที่เป็นทางการสักหน่อย ท่านอาจสนใจแวะเข้าไปอ่านได้ที่ http://courses.ischool.berkeley.edu/i290-4/f08/slides/Thursday_Week2_Intro_Physical_Computing.pdf  หรือ https://en.wikipedia.org/wiki/Physical_computing#In_Scientific_Applications ก็จะเห็นภาพชัดเจนขึ้นครับ

Scratch กับ Physical Programming

มีนักพัฒนานำ Scratch ไปดัดแปลงเพื่อใช้ในเรื่อง Physical Programming ในรูปแบบของ modification (ดู ตอนที่ 1) หลายรายได้แก่

สำหรับ Raspbian เอง แม้ว่าจะยังใช้งาน Scratch 1.4 ก็จริง แต่ก็ได้มีการเพิ่มคุณสมบัติที่ทำ Scratch บน Raspbian สนับสนุน Physical Programming คือ GPIO Server และ Remote Sensing Protocol

Scratch GPIO Server

Raspbian Jessie ได้มีการเพิ่มคุณสมบัติ GPIO Server  เข้ามาทำให้ Scratch สามารถติดต่อกับ GPIO Pin ได้โดยตรง รวมไปถึง Extension board ของ Raspberry Pi ด้วย เช่น

  • SenseHat จากโครงการ AstroPi (https://astro-pi.org/)
  • PiBrella (http://pibrella.com/)
  • ExplorerHat (https://shop.pimoroni.com/products/explorer-hat)
  • PiFace (http://www.piface.org.uk/)

 นอกจากนี้ GPIO Server ยังอนุญาตให้ Scratch เข้าถึงทรัพยากรอื่นคือ USB Camera / Camera Module, IP Address และ Datetime ด้วย

Remote Sensing Protocol

เป็นคุณสมบัติที่เพิ่มเติมเข้ามาเพื่อให้ Scratch สื่อสารกับโปรแกรมอื่นได้ผ่าน TCP Network โดยที่ Scratch จะเปิด port สื่อสารหมายเลข 42001 ไว้และสื่อสารกับโปรแกรมอื่นผ่านกลุ่ม Sensing blocks  และ Broadcast  block

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

  • ข้อความเดี่ยว หรือ ข้อความที่อยู่ภายในเครื่องหมาย " " เช่น cat, "hello world"
  • ตัวเลข เช่น 0.2, 123, -1.5
  • ค่าทางตรรกะ คือ true หรือ false

ทั้งหมดในตอนนี้กล่าวถึงความหมายและตัวอย่างของ Physical Programming แบบกว้าง ๆ และกล่าวถึง Scratch ใน Raspbian ว่าสนับสนุนการสร้าง Physical Programming อย่างไร ตอนต่อไปก็จะเริ่มกล่าวถึงตัวอย่างการใช้ Scratch ในการทำโครงงานกันครับ





















เริ่มเรียนรู้ Physical Programming ด้วย Scratch และ GPIO บน Raspberry Pi ตอนที่ 1

เร่ิมต้นด้วยการตั้งคำถาม "เหตุผลที่เราควรศึกษาการสร้างซอฟต์แวร์ คืออะไร ?" มีหลายแห่งที่ให้คำตอบในเรื่องนี้ แต่ผมขออ้างอิงจากเว็บไซต์ของสถาบันส่งเสริมการสอนวิทยาศาสตร์และเทคโนโลยี ดังนี้ ครับ

Scratch คือซอฟต์แวร์ที่ช่วยในการเรียนรู้การสร้างโปรแกรมคอมพิวเตอร์ ในสภาพแวดล้อมที่เรียกว่า Visual Programming Environment ซึ่งในสภาพแวดล้อมนี้จะทำให้ผู้เริ่มต้นสามารถเรียนรู้การพัฒนาซอฟต์แวร์โดยไม่ต้องใช้สภาพแวดล้อมแบบนักคอมพิวเตอร์ แต่ใช้การสร้างปฎิสัมพันธ์กับรูปภาพที่เห็นบนหน้าจอแทนซึ่งทำความเข้าใจได้ง่าย


                         By scratch.mit.edu, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=35453328




เนื่องจากพื้นฐานการสร้างซอฟต์แวร์นั้นมาจากการคิด ดังนั้นผู้เรียนหรือผู้ใช้ไม่ว่าจะเป็นเด็ก หรือผู้ใหญ่ที่เพิ่งเริ่มต้น Scratch สามารถเรียนรู้ผ่านการสร้างสรรค์งานต่าง ๆ ได้ เช่น Animation, Games, Story telling, Art works, ฯล โดยมุ่งไปที่การพัฒนารูปแบบการคิดได้อย่างเต็มที่ ไม่ต้องสนใจหรือกังวลกับเรื่องหลักการทางภาษา Computer programming  ปัจจุบัน Scratch ถูกนำไปใช้ในการสอนในกว่า 150 ประเทศ ถูกแปลเป็นภาษาท้องถิ่น 40 ภาษา ซึ่งทางสถาบันส่งเสริมการสอนวิทยาศาสตร์และเทคโนโลยี ก็ได้จัดทำตำราเรื่องการใช้ Scratch ไว้แล้วเช่นกัน








Scratch ถูกนำมารวมไว้ใน Raspbian  เพื่อใช้ติดตั้งบน Raspberry Pi ทุกรุ่นตั้งแต่เริ่มต้นจนถึงปัจจุบัน และได้มีการพัฒนาขีดความสามารถมาตลอด แต่ Scratch ที่ติดตั้งบน Raspberry Pi จะแตกต่างจาก Scratch ที่มีอยู่บนเว็บไซต์ (https://scratch.mit.edu/projects/editor/?tip_bar=getStarted)
และรุ่นที่อยู่บนเว็บคือ 2.0 และไม่สามารถใช้งานบน Raspberry Pi ได้โดยตรง

ในบทความนี้จะกล่าวแนะนำ Scratch เท่านั้น เพื่อจะนำเขาไปสู่เรื่องการใช้ Scratch กับ Physical Programming ดังนั้นรายละเอียดการใช้งานจะละไว้ให้อ่านจาก https://kidsangsan.com/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%82%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B9%82%E0%B8%9B%E0%B8%A3%E0%B9%81%E0%B8%81%E0%B8%A3%E0%B8%A1-scratch/ ซึ่งเขียนไว้ละเอียดดีมาก ครับ

Scratch Modification

เรียกสั้น ๆ ว่า Scratch mod เป็น Scratch  ที่มีการถูกนักพัฒนานำไปดัดแปลงเพื่อให้มีคุณสมบัติใหม่ตามต้องการ ปัจจุบันมี Scratch จำนวนมาก ท่านสามารถติดตามข้อมูลได้จาก https://wiki.scratch.mit.edu/wiki/List_of_Scratch_Modifications

ข้อควรทราบ 

Scratch ที่มากับ Raspbian จะต่างจากรุ่นที่มีอยู่บนเว็บไซต์ https://scratch.mit.edu ดังนี้

1. ปัจจุบันทางคณะผู้พัฒนาได้ออก Scratch รุ่น 2.0 มาแล้ว แต่รุ่นที่มากับ Raspbian เป็นรุ่น 1.4 (https://wiki.scratch.mit.edu/wiki/Scratch_1.4)

2. Scratch 2.0 ได้เปลี่ยนเครื่องมือที่ใช้พัฒนาไปเป็น Flash ซึ่งไม่สามารถนำมาใช้งานบน Raspbian ได้ แต่สามารถติดตั้งใช้งานบนคอมพิวเตอร์ PC ได้ (https://scratch.mit.edu/scratch2download/) ในขณะที่รุ่น 1.4 พัฒนาด้วยภาษา SmallTalk

3. มีคุณสมบัติใหม่ที่เพิ่มขึ้นใน Scratch 2.0 หลายประการ (https://wiki.scratch.mit.edu/wiki/Scratch_2.0) ได้แก่

  • Sound Editor 
  • Customer Block ผู้ใช้สามารถสร้าง block คำสัั่งเพิ่มเติมเองได้
  • Video sensing 
  • Cloud storage
  • ฯล




[ตอนที่ 2][ตอนที่ 3][ตอนที่ 4] [ตอนที่ 5]

การใช้ KWL

การสอนเด็กโดยใช้แผนภาพ (Diagram) เป็นวิธีที่มีประสิทธิภาพมาก ทำให้เขาเข้าใจเรื่องราวได้ง่ายและเร็ว คนอธิบายเองก็ไม่สับสนด้วย และแน่นอนว่าเขา...