หน้าเว็บ

วันพุธที่ 5 กันยายน พ.ศ. 2561

micro:bit with TM1637 4 digit 7 Segment

ไอซี TM1637 ของบริษัท Titan micro electronics ออกแบบมาเพื่อควบคุมการแสดงผล 7 Segment แบบคอมมอนอาโนดได้สูงสุด 6 หลัก  โดยใช้ขาควบคุมเพียง 2 เส้นคือ DIO (ขาข้อมูล)  และ CLK (สัญญาณนาฬิกา) และยังสามารถปรับความสว่างของ 7 Segment ได้  นอกจากนี้ไอซีตัวนี้ยังสามารถต่อสวิตช์ร่วมได้อีก 16 ตัว

การเชื่อมต่อกับ micro:bit ผ่านบอร์ด PLAY:BIT ทำได้ง่าย ๆ กับสายเพียง 4 เส้นดังรูป


ในรูปต่อ
ขา 13 ==>  CLK
ขา 14 ==>  DIO
ขา VCC ==> +
ขา GND ==> -









สำหรับการเขียนโค้ด ด้วย micro:bit เพื่อให้ง่าย สามารถใช้ Package ที่มีผู้ทำอยู่แล้วมาใช้งานได้  ตามลิงก์นี้
https://github.com/zhuning239/TM1637


โดยกดเลือกที่คำสั่ง Add Package







จากนั้นวางลิงก์  https://github.com/zhuning239/TM1637  ลงในช่อง URL และกดเพื่อค้นหา




จะพบ TM1637 ให้กดเลือก





หน้าจอจะพบกลุ่มคำสั่ง ของ TM1637 ปรากฎขึ้นมา




มาดูตัวอย่างการเขียนโปรแกรมอย่างง่าย ๆ กันครับ





จากตัวอย่างเป็นการกำหนดให้ TM1637 เชื่อมต่อกับขา 13 และ 14 ของ micro:bit และจำนวน 7 Segment มี 4 หลัก จากนั้นวนลูปเพื่อนับค่าตัวเลขขึ้นไปเรื่อยๆ ทุก ๆ 1 วินาที โดยทุกครึ่งวินาที แสดงการติดดับของ LED ตำแหน่งตรงกลางด้วย
 โดยคำสั่งสำคัญประกอบด้วย


การสร้างออบเจ็กต์สำหรับ TM1637 



โดย
  • clk,  เป็นขาพอร์ตขาใดก็ได้
  • dio,  เป็นขาพอร์ตขาใดก็ได้
  • intensity, กำหนดค่าความสว่างของจอมีค่าตั้งแต่ [0-8]
  • count, คือจำนวน 7 Segment มีค่า [1-5]



เปิดการแสดงผล 7 Segment



ปิดการแสดงผล 7 Segment




เคลียร์ค่าข้อมูลการแสดงผล





แสดงตัวเลขในตำแหน่งที่ระบุ





แสดงค่าตัวเลขจำนวนเต็ม





แสดงค่าตัวเลขฐานสิบหก





แสดงจุด (จากการทดสอบแสดงได้แค่จุดกึ่งกลาง : เท่านั้น )





กำหนดค่าความสว่างหน้าจอ








วันอังคารที่ 4 กันยายน พ.ศ. 2561

Running 20 LED on Arduino

แนวคิดง่าย ๆ กับการเขียนโปรแกรม Arduino ทำไฟวิ่งจนครบขาทั้งหมด 20 ขา



ลิงก์ของ ThinkerCad ตามนี้

http://bit.ly/2oDYpmr

ส่วนโปรแกรมก็ตามนี้


ซึ่งหัวใจคือการประกาศตำแหน่งขาต่างๆ ซึ่งไม่เรียงต่อกัน ผ่าน Array

Arduino Uno with 74HC595


วันนี้มีคำถาม สอบถามเรื่องการต่อ Arduino กับ 74HC595 ไหน ๆ ก็ตอบคำถามแล้ว เอารายละเอียดที่ทำไว้มาบันทึกลง บล็อกไว้เลยดีกว่า ทั้ง ส่วนของการต่อวงจร และลิงก์สำหรับการทดสอบการทำงานผ่าน 123D Circuit (ปัจจุบันไปรวมตัวอยู่กับ ThikerCad แล้ว) ลิงก์สมบูรณ์ตามนี้เลย
ทั้งวงจรและการจำลองการทำงาน
http://bit.ly/2NLNj9P
สำหรับโค้ด



วันศุกร์ที่ 31 สิงหาคม พ.ศ. 2561

#pragma once

วันนี้ไปเจอส่วนหัวของโปรแกรม มีคำสั่งนี้มาก่อนเลย

#pragma once
ก็เลยไปหาข้อมูลและขอเก็บบันทึกไว้กันลืม

File "grandparent.h"
#pragma once

struct foo 
{
    int member;
};
File "parent.h"
#include "grandparent.h"
File "child.c"
#include "grandparent.h"
#include "parent.h"


จากตัวอย่างไฟล์ child.c เรียกใช้ parent.h และ grandparent.h  แต่ parent.h มีการเรียกใช้ grandparent.h อยู่แล้ว ภาษา C จะแจ้ง error เพราะว่าเป็นเรียกไลบรารี่ซ้ำ ดังนั้น ปกติ เมื่อเขียนไลบรารี่จะต้องมีการกำหนด คำสั่งเป็น

#ifndef GRANDPARENT_H
#define GRANDPARENT_H
... contents of grandparent.h
#endif 

ซึ่งใช้ #ifdef เพื่อตรวจสอบว่า มีการเรียกใช้ grandpatent.h แล้วหรือยัง ถ้ายังก็อนุญาตให้เรียกใช้  ทั้ง 3 คำสั่งนี้สามารถแทนด้วย #pragma once เพียงคำสั่งเดียว 
หมายเหตุ ต้องดูคอมไพเลอร์แต่ละตัวด้วยว่ารองรับหรือไม่ ที่แน่ๆ ใช้ได้กับ arduino ครับ

วันเสาร์ที่ 3 มิถุนายน พ.ศ. 2560

วันเสาร์ที่ 10 กันยายน พ.ศ. 2559

[IPST-SE] แนวการเขียนโปรแกรม STEM FESTIVAL 2016 EP.1

ตอนที่ 1 การอ่านบาร์โค้ด

STEM_Fes01

STEM_Fes02

บาร์โค้ดประกอบไปด้วย สี 3 สีคือ สีดำ สีน้ำตาลและสีขาว โดยแผ่นบาร์โค้ดออกแบบให้สีน้ำตาลเป็นพื้น สีดำ แทนลอจิก “1” สีขาวแทนลอจิก “0”  แถบบาร์โค้ดมีทั้งหมด 3 แถบ แทนตัวเลขฐานสอง 3 บิต ให้ค่าเท่ากับ 0 ถึง 7

STEM-Barcode

แถบสีที่ 3

แถบสีที่ 2

แถบสีที่ 1

ค่าที่ได้

สีขาว สีขาว สีขาว 0
สีขาว สีขาว สีดำ 1
สีขาว สีดำ สีขาว 2
สีขาว สีดำ สีดำ 3
สีดำ สีขาว สีขาว 4
สีดำ สีขาว สีดำ 5
สีดำ สีดำ สีขาว 6
สีดำ สีดำ สีดำ

7

การอ่านค่าแถบสีน้ำตาลด้วย ZX-03

ZX-03 For Brown

โดยปกติ ZX-03 จะอ่านค่าได้เฉพาะสีในช่วงโทนสีเทา คือไล่ลำดับตั้งแต่สีขาวไปจนถึงสีดำเท่านั้น  แต่ถ้าติดตั้งเซนเซอร์ให้สูงจากพื้นมากขึ้น ดังรูป ZX-03 จะสามารถแยกโทนสีอื่นๆ ได้ด้วย ซึ่งในที่นี้ใช้สีน้ำตาล โดยการอ่านค่าแสดงที่หน้าจอ GLCD ให้ค่าดังนี้

i-BOT-With-ZX-03-On-Black-Brown-White

ในการอ่านค่าบาร์โค้ด เราจะเลือกใช้เซนเซอร์ด้านใดด้านหนึ่งเท่านั้น ในที่นี้เลือกใช้เซนเซอร์ด้านขวา

จากรูปค่าที่อ่านได้ พอสรุปได้ว่า จะต้องสร้างค่าอ้างอิงขึ้นมา 2 ช่วง คือ
ค่าอ้างอิงระหว่างสีขาวกับสีน้ำตาล เท่ากับ (890+440)/2   = 665

ค่าอ้างอิงสร้างเป็นตัวแปรได้เป็น word whiteBrown=665 ;

ค่าอ้างอิงระหว่างสีน้ำตาลกับดำ เท่ากับ (440+90)/2 = 265

ค่าอ้างอิงสร้างเป็นตัวแปรได้เป็น word blackBrown=265 ;

การเขียนโปรแกรม โดยใช้คำสั่ง while

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

ตัวอย่าง

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

while (analog(1)<blackBrown) {
      fd(40);delay(12);    
}    
ao(); delay(100);

หมายเหตุ ค่า delay(100); ที่ตามมาเพื่อให้เห็นว่าหุ่นยนต์หยุดจริงๆ ก่อนไปทำงานส่วนถัดไป

การตรวจสอบแถบสีขาวหรือดำ

ปัญหาอยู่ตรงที่ เมื่อเดินผ่านสีน้ำตาลมาแล้ว ไม่แน่ใจว่าสีต่อไปเป็นสีขาวหรือสีดำ  จึงต้องเขียนเงื่อนไข while ดักไว้สองกรณีคือ มีค่ามากกว่าสีน้ำตาล (ขาว) และ มีค่าน้อยกว่าสีน้ำตาล (ดำ)  โดยใช้ AND (&&) มาช่วย  โดยให้เงื่อนไขเป็นเท็จ เมื่อเจอสีขาวหรือสีดำ และค่อยแยกแยะว่า สีที่ตรวจพบเป็นสีขาวหรือดำ

ตัวอย่าง

เดินผ่านสีน้ำตาลจนเงื่อนไขเป็นเท็จแล้ว จึงใช้คำสั่ง if ตรวจสอบว่าเป็นสีขาวหรือดำ จากนั้นนำค่าแสดงที่หน้าจอ

while (analog(1)>blackBrown&&analog(1)<whiteBrown) {

fd(40);delay(12);

}

ao(); delay(100);
if (analog(1)<blackBrown){
       glcd(2,0,"BLACK");     
}    
else if (analog(1)>whiteBrown){
      glcd(2, 0, "WHITE");    
}

 

การอ่านค่าบาร์โค้ด 3 แถบก็คือการเคลื่อนที่ลักษณะนี้ซ้ำ 3 ครั้ง แล้วนำค่าที่อ่านได้ทั้ง 3 บิต มารวมกัน สรุปเป็นโค้ดได้ดังนี้

เราสามารถนำค่าบาร์โค้ดจากตัวแปร BAR ไปใช้เพื่อตรวจสอบเส้นทางการเดินในขั้นตอนต่อไปได้

 

 

 

 

 

 

 

วันอังคารที่ 24 พฤศจิกายน พ.ศ. 2558

บันทึกช่วยจำ Raspberry Pi

ถาม  ถ้าต้องการพิมพ์เครื่องหมาย % ให้แสดงที่คำสั่ง Print  ต้องใช้คำสั่งอย่างไร
ตอบ ต้องใช้ "%%"  

ถาม   ฟังก์ชัน datetime.datetime.now() จะแสดงค่า วันเดือนปีและเวลา และค่าไมโครวินาทีของเวลาด้วย ถ้าต้องการแสดงแค่บางส่วนต้องทำอย่างไร
ตอบ  date=str(datetime.datetime.now().strftime("%Y-%m-%d : %H:%M:%S")) จะเป็นการกำหนดรูปแบบ วันที่และเวลาได้