วันพฤหัสบดีที่ 30 กันยายน พ.ศ. 2564

Read and Show LCD1602

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

    ต่อกับคอมพิวเตอร์ ใช้ port monitor ก็สามารถแก้ปัญหาได้ แต่เวลาใช้ serial monitor ใน IDE นี่ก็ไม่ค่อยดี
เหมือนกับว่ามันต้องพิมพ์ออกมาเป็นข้อความ ถ้าใช้ serial.print ก็แสดงผลได้ปกติ พอเปลี่ยนเป็นเป็น serial.write จะเป็นภาษาต่างดาว 

    นอกจากนี้ ได้ลองเอาหน้าจอ LCD1602 มารับข้อความขาเข้า จะได้รู้ว่ามันรับอะไรเข้ามา มาหรือไม่มา
รับมา 8 byte 16digit พอดีกับ LCD1602 เลย
LCD1602 แต่ก่อนก็ใช้งานได้ แต่เดี๋ยวนี้มันพิมพ์ออกมาแต่ตำแหน่ง 0,0 วนๆ ซ้ำๆ

    ถ้าเป็นอย่างนี้ต้องเอา library อื่นมาใช้แทน

เอาสัญญาณที่ส่งเข้ามาใน serial port Rx, Tx ซึ่งมันเป็น byte , char แปลงเป็นข้อความรูปแบบ Hex, ทำ zero leading พิมพ์ออกมาดู

    ก็จะทำให้เห็นสิ่งที่รับเข้ามา งานก็สะดวกขึ้น

ค่าที่เป็น HEX byte ที่เพิ่งรับเข้ามาทาง Rx ถ้าต้องการแสดงผลเป็น DEC อย่างเช่น ค่า Temperature
ก็เอามาแปลงค่าก่อนแล้วจึงแสดงผลออกมาทางหน้าจอ
    มันรับเข้ามาเป็น byte ก็แค่จัดการคูณด้วยค่าประจำหลัก
อย่างเช่น รับค่าเข้ามา 0x01 0x36 <--- จำนวน 2 HEX bytes
อย่างนี้มันหมายถึง 0x0136 ค่าของมันคือ 310DEC

1st byte  0x01 x 16 x16 = 256DEC
2nd byte 0x36 no need to multiply ไม่ต้องทำอะไร
int Val = [1st Byte ]*16*16 + [2nd Byte]; แบบนี้ในโปรแกรมจะจัดการออกมาให้เป็น 310DEC
ก็เขียนให้แสดงผลได้แล้ว อย่างนี้ lcd.print(Val);

LCD1602 incoming Rx display


At Dormitory
Sep30, 2021 18:32

วันพุธที่ 22 กันยายน พ.ศ. 2564

OP320 FREE PROTOCOL

     ทะยอยเอางานทดลองมาเรียบเรียงไว้ เพียงเพื่อวันข้างหน้าจะได้รื้อฟื้นมันขึ้นมาได้โดยง่าย ของมันนานเข้าก็ลืมได้ หลายรอบที่ไม่ได้จดบันทึก กว่าจะทบทวนได้ใช้เวลานาน

    งานนี้ได้จัดทำเอา OP320A/S [OP] มาสื่อสารกับ Arduino รับข้อมูลทาง RS485 port แต่ไม่ได้ใช้ Modbus protocol ในตัวเครื่อง OP จะมีอยู่โหมดหนึ่ง เรียกว่า Free Protocol ให้ใช้งานได้ มันมีรูปแบบคำสั่งสำหรับการสื่อสารที่กำหนดมาเฉพาะ หาอ่านได้จากคู่มือ ที่หาได้ยากยิ่ง ในตัว OP จะเตรียม register ไว้ให้ประมาณ 255 ตัวและยังสามารถกำหนด SLAVE ID. ได้

    โดยคำสั่งจะประมาณนี้

การอ่านค่า function 0x52 มีทั้งหมด 5 bytes
    01 52 02 01 CC |  01 ID, 52 Function, 02 Address, 01 data q'ty และ CC --Sum check (เอา byte รวมกันหาร 0x100 เอาเศษเหลือ)

การเขียนค่า function 0x57 มีทั้งหมด 7 bytes
    01 57 05 01 DA TA CC | 01 ID, 57 Function, 05 Address, 01 data q'ty, DA hi-byte data, TA lo-byte data,CC --sum check


    ที่ Arduino ก็เอาค่าวัดจากเซนเซอร์ใส่เข้าไปใน payload  ค่าเซนเซอร์ได้มาเป็นเลข ทำให้เป็นข้อความ ทำ zero-leading ก่อนเด้อ จากนั้นเอา payload ส่งให้ OP (ต้องส่งเป็น byte )

ไม่สนใจข้อความตอบกลับอีกเช่นเคย เว้นแต่อยากจะ cross check
ข้อความตอบกลับของ Function 0x57
01 00 01  โดยที่ 1st byte คือ function, 2nd byte คือ Error code , 3rd sum check
Error detail:
00 OK!
01 Wrong address
02 Wrong length
03 Wrong range
04 Wrong command
    

sending measured values to OP320

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

 

OP write value to internal register.

ตบท้ายด้วยการกำหนด coil (MW00 - MW254)
OP320 กำหนดให้ทุกบิทในแอดเดรส จะให้เป็น coil ได้ โดยใน 1 Address มี 16 bits
อย่างเช่น กำหนด coil อยู่ที่ address 10 bit no. 2 เมื่อทำกราฟฟิกแล้ว กดเปิด กดปิด ที่หน้าจอ
แล้วลองส่งคำสั่ง
                        Tx: 01 52 0A 01 5E
                        Rx: 01 00 0A 01 00 02 0E    สถานะนี้คือมัน ON อยู่

แต่ถ้า               Rx: 01 00 0A 01 00 00 0E    สถานะนี้คือมัน OFF อยู่

และเราก็สามารถส่งค่าให้มัน ON / OFF ก็ได้ โดยใช้ function 0x57 ส่งค่าหมายเลข bit ให้มัน

    เรื่องที่น่าเบื่อเรื่องหนึ่งคือสายไฟ ต่ออุปกรณ์เข้าหากัน เดี๋ยวดีเดี๋ยวร้าย เลยไม่รู้ว่าโปรแกรมไม่ดีหรือสายไฟไม่ดี ต้องหามิเตอร์ไฟฟ้ามาวัด แยกเอาของไม่ดีทิ้งไป จะได้ไม่ต้องกังวลตอนรันโปรแกรม.

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

SENDING TO SLAVE

 


มีอยู่งานทดลองเล่นๆ งานหนึ่งต้องเอามาเขียนไว้กันลืม
คือการส่งข้อมูลเซนเซอร์ไปให้ PLC ตอนนี้เซนเซอร์เยอะแยะ ประหลาดๆ ราคาถูกๆ มันก็มีเป็น module ของ Arduino ซะเยอะ
คือถ้าเป็นเซนเซอร์ที่ output เป็น Analog หรือไม่ก็มี protocol RS485 ก็ไม่ลำบากไรมาก ต่อเข้า PLC ได้สะดวก แต่ถ้าสื่อสารกันด้วย TTL/I2C/SPI ก็ลำบากนิด
    นึกอยากจะใช้เซนเซอร์เหล่านี้ ก็เอาของที่มีอยู่มาลอง ไม่ต้องลงทุนเพิ่มแล้วล่ะ ก็ต่อผ่าน Arduino ให้มันส่งค่าไปให้ PLC

เหมือนงานเก็บข้อมูล ต้องให้ PLC เป็นบ่าว(Slave) แล้วบอร์ดน้อยเป็นนาย(Master)
อ่านค่าได้แล้วก็จัด payload ส่งไปให้ยังเครื่องรับ เป็นแบบนี้วนๆ ไป

ใช้ Function 06:
    01 06 00 01 AA BB CR LF |  00 01 คือแอดเดรส ที่ FX3U หมายถึง D1 ชุดคำสั่งต้องอ้างอิงคู่มือ PLC
AA BB คือข้อมูลที่ต้องการส่ง ตบท้ายด้วย CRC ซึ่งต้องเขียนโค้ด เพราะข้อมูลเปลี่ยนไปตามที่วัดจากเซนเซอร์ CRC ก็เปลี่ยน

อุปกรณ์
Sensor <====> Arduino --------->PLC
ในฐานะบ่าวที่ดี PLC ก็ตอบกลับมาแบบเลี่ยงไม่ได้ แต่เราก็ไม่ฟัง สั่งอย่างเดียว (แท้จริงแล้วควรฟังอ่ะนะว่ามันได้อย่างสั่งหรือไม่)


 

Receiving data on PLC side.


 ต้องส่งเป็น byte เป็นข้อความไม่ได้

กันลืม การต่อขา
DHT11 module
    OUT --- PIN_D2

LEVEL CONVERTER TTL-485
    TX --- TX PIN0
    RX --- RX PIN1

  


LOG NOT A ROCK

บันทึกกันลืม วันนี้
    เอาเจ้าบอร์ดน้อยมาทำ master ให้เล่นใหญ่เป็นเจ้านาย สั่งพี่ใหญ่อย่าง FX3U
สั่งนี่สั่งจริงๆ ทั้งขอข้อมูล(03) และส่งข้อมูลไปให้เก็บ (06)

มันเป็น Q&A ประมาณนี้

ARDUINO ------Q------> PLC
[MASTER]                   [SLAVE]

 ARDUINO <------A------ PLC
[MASTER]                   [SLAVE]

อ่านค่า register (ค่า analog) function 03
    ต้องกำหนดค่าให้พี่ใหญ่เป็นทาส (วิธีการทำให้ดูคู่มือเป็นหลัก)  ให้พี่ใหญ่อ่านค่า analog เก็บไว้ จากนั้นให้เจ้านายน้อยไปล้วงข้อมูลมา โดยลองเอา 0-10v ใส่ช่อง 1 และ 0-20mA ใส่ช่อง 4

|----MOV H4081 D8120|   PLC as SLAVE 9600 8N1 //refer to Chinese Manual
|------RD3A K0 K0 D0--|  แล้วย้ายไป D10, D11 รอไว้อ่าน
|------RD3A K0 K3 D1--|

โค้ดต้องเขียนให้มันส่งข้อความออกไปให้ทาสก่อน (ที่ FX3U register 0x0000 คือ D0 เรียงไป)
พอมันตอบกลับ ก็ตัดท่อน เอา byte ที่ต้องการไปใช้งาน ต้องเปลี่ยนจาก byte ไปเป็น Hex String  ควรทำ zero leading ด้วย ข้อมูลที่ต้องการอยู่ byte ที่ 3,4,5 และ 6
   ที่ Master  Tx: 01 03 00 0A 00 02 CR LF
                    Rx: 01 03 04 AA BB CC DD CR LF  ทั้งหมด 9 bytes เพราะถามไป 2 แอดเดรส

ถ้าเป็นการส่งค่า 01 06 00 0A BB CC CR LF ข้อมูลอยู่ byte ที่ 5, 6 เอาค่าจากเซนเซอร์ไปให้ก็ได้ แต่ต้องแปลงเป็น byte ก่อน

 

ส่งค่า sensor I2C ไป PLC


    รับค่ามาแล้วก็เอาไปใส่ SD module (มันมี buffer 512byte) ซึ่งเราอ่านมาทีละไม่เกิน 12 byte
อ่านมาแล้วไม่บันทึกมันก็ล้น buffer ต้องบันทึกเรื่อยๆ เผื่อไฟดับ ไรงี้
การบันทึกก็ close() แล้วถ้าไม่จำเป็นก็ไม่ต้องเก็บถี่มาก ทุก 5 วินาที ก็ว่าเยอะแล้ว
    ข้อสังเกตุ การบันทึกทีละ byte เหมือนกับว่ามันจะช้า
ควรทำการแปลงข้อมูลให้เสร็จแล้วเขียนทีเดียวน่าจะดีกว่า ระหว่างข้อมูลใส่ "," ให้มันด้วย

logged data from PLC

เก็บมาเป็น hex ก็ไม่ลำบากไรมาก เอามาแปลงข้างนอกจะได้ไม่เป็นภาระบอร์ดน้อย แล้วใช้ตารางคำนวณเข้าช่วย

convert hex to dec by librecalc
ที่ PLC ตรงส่วนค่า analog มันจะมี span 0 - 4095 จากที่ลองป้อน simulate ไปสูงสุด 20mA/10V มันก็ได้แค่ 39xx อยากให้แม่นก็ต้องปรับเทียบเอา

บอร์ดน้อยจอมบงการ

เอาไว้เก็บข้อมูลก็ดีนะ

 ชอบลืม
SD module                                                       LCD1602 module
CS ------PIN_D10                                            |    DATA--PIN_A4
MOSI---PIN_D11                                            |    SCK----PIN_A5
MISO---PIN_D12                                            |
SCK-----PIN_D13 

LEVEL CONVERTER TTL - RS485
TX---TX PIN0
RX---RX PIN1
  
                                        


วันจันทร์ที่ 20 กันยายน พ.ศ. 2564

OP320 vs Arduino

มันมีรูปแบบการสื่อสารกันเป็นชุดคำสั่ง 01 02 03 04 05 06 07 08
1st คือเลขประจำตัว 3rd - 4th byte คือ เลขรีจิสเตอร์
7-8th byte คือ CRC
    อุปกรณ์แต่ละตัวจะเก็บค่าอะไรไว้ เราต้องการรู้ค่านั้น ก็ถามมัน เราต้องรู้นะว่าต้องถามใคร หมายเลขอะไรเก็บข้อมูลนั้นไว้ ในคู่มือจะบอกไว้ เขาเรียก Register Address
Modbus protocol มันมีรีจิสเตอร์ประมาณนี้

 OP320 ModbusRTU --Master mode:

    ยังวนเวียนอยู่กับหน้าจอนี้และวันนี้ได้เอา Arduino มาเล่นเป็นบททาสดูบ้าง
เป็นเจ้านายก็มาหลายงานละ

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

อุปกรณ์ที่สื่อสารกันบน Modbus protocol มันจะมี register ทั้งนั้น ดูรายละเอียดในคู่มือของอุปกรณ์นั้นเด้อ register มันเลขอะไร มันมีความหมายอยู่นะ ตามตารางนี้ เวลาจะเอาไปเขียนโค้ดก็ใช้ให้ตรง

register table
    OP320 เมื่อเปิดเครื่องมันจะส่งคำถามออกมา ทุกวินาที ที่ Rx buffer มากกว่า 8 byte ถ้าอยากให้เร็วก็ลด Timeout ที่ โปรแกรมของ Arduino อย่างเช่น 50 - 100ms กำลังดี (Rx buffer = 8 มันจะส่งข้อมูลกันเร็วจี๋ Arduino มันมี timeout ตั้งต้น 1 วินาที )
เวลาทำกราฟฟิก reg 4x มันจะส่ง FC03 ออกมาเพื่ออ่านค่า AO และคำถามที่มี Arduino มันต้องคอยตอบ
ที่ทดลองทำไว้คือการวัดค่า Temperature Humidity จาก DHT11

[OP320]  <==serial==> [Arduino]  <==I2C==> [DHT11]

    ได้ลองทำแบบที่ไม่ได้ใช้ Library ส่วนอะไรที่ไม่มีเราก็ต้องสร้างมันขึ้นมา
ในโค้ดก็ดูว่ามีข้อมูลใน buffer ไหม อย่างแรกก็ดูเลข Slave ID ถ้าไม่ใช่ ก็เฉยไว้ เมื่อทุกอย่างต้องตรงกัน ก็ตอบกับออกไปพร้อม CRC



เอาไปใช้งานแนวๆ รับข้อมูลจากเซนเซอร์ I2C bus, Analog input และควบคุมเครื่อง

วันศุกร์ที่ 17 กันยายน พ.ศ. 2564

OP320AS

     วันไหนว่างๆ จะเอาสิ่งที่ทำไว้ มาบันทึกเป็นเรื่องๆ ไว้กันลืม ไม่ได้ลงรายละเอียดเรื่องโค้ด

วันนี้อยากจะเอา OP320-A/S มาลองใช้งานในโหมดต่างๆ ที่มันมี
OP320 เป็น HMI จากจีนราคาไม่สูงมาก พอได้เอื้อมถึง ให้แฟนนานุแฟนได้จัดหามาไว้ใช้งาน

มันใช้ไฟเลี้ยง 24V. มี port RS232 และ RS485 (ซึ่งบางรุ่นไม่มี จะซื้อต้องดูรายละเอียด)

เอามันต่อต่อเข้ากับ RS-485 Devices:

1. ใช้โหมด OP is Master [9600 8N1]

    หลังจากเขียนโปรแกรมเสร็จแล้ว ก็อัพโหลด ต่ออุปกรณ์ มันก็วัดค่า แสดงผลได้
เวลามันเริ่มทำงาน มันจะส่งคำสั่งออกจาก port ไปยัง slave คำสั่งตรงกันกับอุปกรณ์ register ไหน อุปกรณ์นั้นก็ตอบกลับ ถามไปไม่มีใครตอบ OP มันก็ว่า connecting.......

ทำไปทำไม? ก็เพราะมีของอยู่แล้ว ลองเอามาติดต่อกัน เป็นไอเดีย จะเอาไว้ monitoring ก็คงได้ แสดงผลอย่างเดียว

ต้องรู้คำสั่งในการอ่านค่ามัน อ่านและก็อ่าน อ่านจากคู่มือเอา

ทาสในวันนี้ คือ 4AIAO module RS485 ใช้ไฟเลี้ยง 8-25VDC.
มี 4 chanel รับค่า Analog สองช่องแรกเป็น 0-10V, 0-5V  และที่เหลือเป็น 0-20mA อีกสองช่อง
ราคาไม่สูง แลกมาด้วยความหยาบ ตรง 4-20mA มี Resolution 0.1 ถ้าเอาไปใช้งานกับ RTD PT100 นี่ตัวเลขกระโดดมากมาย
ใช้ Function Code 03 เพื่ออ่าน
01 03 00 01 00 01 + CRC
byte ที่ 3,4 คือ แอดเดรส

ไม่เคยลองดูแบบหลายๆ ตัว แต่ OP มันถามเรียงตัวแอดเดรสมาเลย




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

ของกระจุกกระจิกเป็นเหตุสังเกตุได้...



    ...หลายปีดีดัก ห่างหายจากการเขียนข้อความ จะเรียกว่าขาจรก็คงไม่ผิดนัก ว่างๆ ก็เอาซะหน่อย
แต่ชีวิตมันก็มีกันบ้างล่ะน่ะ บางมุมก็สนใจเรื่องนั้น นู่น นี่ โน่น เปลี่ยนหมุนเวียนกันไปตามกาล ตามเวลาตามวัย และเงิน.. 

    หลังจากเก็บของในบ้าน ก็พบของเล่นที่ซื้อมาตอนเขาฮิตๆ กัน
มันคือ...

    Arduino กับผองเพื่อน นี่เป็นแก๊งค์เล็กๆ และยังมีพี่ใหญ่ PLC FX3U ผู้มากล้นด้วยความสามารถ

ซื้อมาเล่นๆ แผรบๆ ก็เบื่อ เบื่อก็เก็บใส่กล่อง

ช่วงนี้เป็นช่วงโรคระบาด มีเวลาเลยเอามาเล่นกันซะหน่อย

ของที่มีอยู่นี่ก็พอเล่นได้ อีกนาน ตามแต่จะจินตนาการ มีบางชิ้นยังไม่ได้แกะห่อเลยด้วยซ้ำ

เป็นการเล่าสิ่งที่ทำลงไป บ้าบอยังไง ล้าหลัง บ้านนอกยังไง ก็ตามแต่ปัญญาที่มี อย่าหาเอาวิชาการมาเทียบ

เขียนไว้ เข้าทำนองที่ว่า "ของกิน ถ้าไม่กินมันสิเน่า ของเก่าถ้าไม่เล่าสิลืม"


 

เรื่องที่จะเขียนไว้
เอา HMI OP324-AS V.8 มาแสดงบทเจ้านาย[MASTER] มาต่อกับบรรดาทาส SLAVE RS-485 ลองให้มันสื่อสารกันดู
บรรดานายมันเอาแต่สั่งๆๆๆ ทาสต่างๆ ก็พากันทำตามแบบขัดเสียไม่ได้
แต่ว่าต้องเรียกใช้ทาสให้ถูกชื่อด้วยนะ ไม่งั้นทาสมันทำเป็นไม่รู้ไม่ชี้ เฉยๆ บื้อใบ้กันเลย

คำสั่งมันประมาณนี้
"01 02 03 04 05 06 07 08" เอาแค่ 8 byte แค่นี้พอ อ้อแล้วก็เป็นเลขฐาน 16 หรือที่เรียกกันว่า HEX นั่นล่ะ

จะว่าไปก็จำไม่ได้สักทีว่า bit  byte word อะไรยังไง พอวันนี้จำได้ ผ่านไปสักปี มีลืม

    กลุ่มคำสั่งมันจริงๆ ถ้าเขียนเป็น array ก็ต้องแบบนี้ ถึงจะสื่อความ

[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08] 

คู่ของ HEX ทีละสองตัว ทั้งหมด 8 ชุด แล้วไอ้ HEX สองตัวนี่ก็เรียก byte

ถ้าไม่คิดเครื่องหมาย
เลข HEX  แต่ละคู่นั่นน่ะ มีค่าน้อยสุด คือ

00

เพราะมันเป็น HEX (เลขฐาน 16) คำว่า 16 ก็หมายถึง ในแต่ละหลักมันมีค่าได้ 16 ค่า/เขียนได้ 16 ตัว คือ
เลข 0 1 2 3 4 5 6 7 8 9 A B C D E และ F นับดูเด้อ ได้ 16 ตัวไหมนั่น
ฉะนั้นและฉะนี้ ค่าที่มากสุดคือ

FF 

มันมีสองตัว ตัวแรกมีค่าได้ 16 ค่า(0-F) ตัวถัดไปก็ยังคงมีค่าได้อีก 16 ค่า (0-F)  ซึ่งมันเป็น 16 เท่า
    ตัวแรกมีค่าได้ 16
    ตัวที่สองก็มีค่าได้ 16 ค่า
    สองตัวนี้จะมีค่าได้ 16x16 = 256 ค่า แต่มันเป็นเลข 0 ไปหนึ่งตัว ก็เหลือค่าสูงสุด 255

    เขียน FF คณิตศาสรตร์นี่มีค่า 255  (ถ้าเขียนเรียงจาก 0 - 255 ก็จะได้ค่าที่ไม่ซ้ำกันทั้งหมด 256 (16x16))

ถ้ามีอีกตัว(คือ HEX สามตัว) มากสุดก็ FFF เขียนได้ทั้งหมด 16x16x16 = 4096 ตัว รวม 0
ค่าสูงสุด FFF ก็คือ 4095

อ้ะ ชักงง ลองกลับมาดูเลขฐาน 10(DEC) บ้าง คำว่าฐาน 10 มันก็มีค่าได้ 10 ค่า/หรือเขียนได้ 10 ตัว
คือ 0 1 2 3 4 5 6 7 8 9 นับได้ 10 ตัวใช่ไหม?

ถ้ามีเลขฐาน 10 สองตัว เลขตัวแรกมีได้ 10 ค่า ตัวที่สองมีได้อีก 10 ค่า

ฉะนั้นเลขฐาน 10 สองตัว xx จึงมีได้ทั้งหมด 10x10 = 100 ค่า คือเขียนไม่ซ้ำกันได้ 100 ตัว รวม 0 ด้วยนะ 

เขียนได้ 100 ตัว รวม 0 และค่าที่มากสุดของเลข 2 ตัวนี้ก็คือ 99  ค่าน้อยสุด 00

เลขฐาน 10 สามตัว เขียนได้ 10x10x10 = 1000 ตัว รวม 0   และ 999 ก็คือค่ามากสุด

เห็นไหม เลขฐาน 10 นั้นหลักถัดไปมันมีค่าได้ 10 เท่า!! แบบนี้ไปเรื่อยๆ

10,000 อย่างนี้มี 5 หลัก (และเราก็รู้ว่ามันคือหลักหมื่น หมูมาาาาาก)
อย่าลืมนะแต่ละหลักมันมีค่าได้ 10 ค่า คือ 0-9

พอเห็นแบบนี้มันดูกันต่อ

1  0  0  0  0  มีทั้งหมด 5 ตัวเลข เขียนได้ทั้งหมด 10x10x10x10x10 ตัว 

วิชาเลขม.ต้น บอกว่าอย่างนี้มันคือ 10 ยกกำลัง 5 นะจ้ะ (นะจ้ะ พร่องเมิง ...อิ..อันนี้แซวลุง)

จำไว้หน่อยนะว่ามีกี่หลักก็เอาค่าฐาน(ที่บอกว่า 10 16 นั่นน่ะ) มายกกำลังด้วยจำนวนหลักกันเด้อ

เลขฐาน 10 มี 3 หลัก มันก็เขียนได้ทั้งหมด 10^3 =10x10x10 = 1000 ตัว

เลขฐาน 16 มี 3 หลัก มันก็เขียนได้ทั้งหมด 16^3 =16x16x16 =4096 ตัว

และแล้วก็ถึงคิวน้องเล็กสุดท้อง เลขฐานสอง......

BINARY  BIN   0 1

ออกทะเลมาไกล จากไทยป่านนี้คงถึงโซมาเลีย ตายคามือโจรแล้วมั้ง
ไหนๆ ออกมาแล้วก็ไปให้สุด สุดทะเลลึกกันเลย

ฐาน 2 หรือ BIN

มันก็คล้ายกันกับฐานอื่นๆ ซึ่งในแต่ละหลัก มันก็มีค่าได้ 2 ค่า คือค่า 0 และค่า 1 

และถ้ามีเลขฐานสอง 3 ตัว มันก็มีค่าได้ทั้งหมด 2^3 = 2x2x2 = 8 ค่า รวมค่า 0 ด้วยเน้อ

แวะพักนิด เลขฐานสอง 1 ตัวนี้ ผมเรียกมันว่า 1 bit ถ้ามี 2 ตัวก็เรียก 2 bits, 3 ตัวก็ 3bits

ฐาน 16 เอาแค่ตัวเดียว เอา F นี่แหล่ะ 

F ค่าประจำตัวมันคือ 15 (แต่ลำดับ นับจากที่มันต่อแถวกัน มันก็เป็นลำดับที่ 16)

ลำดับ 16 ที่ว่า มันคือเลข 2x2x2x2 (เลขฐานสองจำนวน 4 หลัก  นั่นๆๆ 4 ตัวคือ 4 bits เด้อ)

F มันคือ 1111 ค่าของมันคือ 15 

(อย่าลืมกันเด้อ ฐานอะไรก็เอาเป็นตัวตั้ง ยกกำลังด้วยจำนวนหลัก จะได้จำนวนเลขทั้งหมดที่เรียงกัน)

 

ค่าประจำหลัก เอาล่ะหว่า....

ฐานสิบถ้ามันมี 3 หลัก ซึ่งจะเขียนได้ทั้งหมด 10x10x10 = 1000 ตัวเรียงกัน เริ่ม 0 -999

แล้วเลขฐานสิบ  เลขที่เขียนอย่างนี้ 155  มันคือ หนึ่งร้อย ห้าสิบ ห้า (พูดช้าๆ ชัดๆ)

 แยกตัวประกอบกันสักหน่อย ป.3-4 ก็เริ่มเรียนแล้ว

    155 = 100 + 50 +5

    1x(100) + 5x(10) + 5x(1)

ในวงเล็บนี่แหล่ะเขาเรียกว่า.....................ค่าประจำหลัก

999 มันก็คือ 9x(100) + 9x(10) + 9(1) 

ดูในวงเล็บเรียงกันไป มันคือ (10^2) (10^1) และ (10^0) สัมพันธ์กับลำดับเด้อ และเลข 10 มันคือเลขฐาน!!

อ้อบอกไว้ 10^1 = 10 และ 10^0 = 1 กดเครื่องคิดเลขดูเอาเด้อ

ส่วนการนับรวม 0 ด้วย มันเริ่มจาก 0 1 2... 

 กลับไปดูเลข 4 bits อีกรอบ อย่างที่บอกไว้ 4 หลัก/4bits ค่าที่มากสุดคือ 1111

1 1 1 1  (มี 4 ตัว เรียงกัน ตำแหน่งตัว 3 2 1 และ 0) ค่าของมันล่ะ แบบเดียวกับเลขฐานสิบข้างบน

1(2^3) + 1x(2^2) + 1x(2^1) + 1(2^0)

8  +  4  +   2  +  1 = 15

F  = 1111 = 15 ฐานสิบ

พอจะเห็นแล้วว่า F นี่คือ 4 bits

เพราะฉะนั้นป่านฉะนี้ FF ก็คือ 8 bits  (Hex เทียบ BIN หน่อยเถอะ มันคือ 1111 1111)

FF สุดท้ายนี่มัน 8bits และเท่ากับ 1 byte มีค่า 255

ทวนดู 15x(16^1)+15(16^0) = 240 + 15 = 255
และ (2^7) +(2^6) + (2^5) + (2^4) + (2^3) + (2^2) + (2^1) + (2^0) = 128+ 64+32+16+8+4+2+1 = 255

สุดท้าย ก่อนจะรู้ตัวว่ามาทะเลลึก

การรับ-ส่ง คำสั่งของเจ้านายจู้จี้เมื่อตอนต้นเรื่อง ถ้าใช้ Serial port มันจะส่ง 8 bits (ไอ้ HEX สองตัว)

จะช้าจะเร็วก็มันต้องเทียบกับสัญญาณนาฬิกา เขาว่า buad rate 

ปกติผมกำหนดให้เจ้านายจู้จี้ กับทาสใช้งานรูปแบบ 9600 8N1  buad rate/8bits/non parity/stop bit 1

ยกยอดไปบทความหน้าเถอะ ยิ่งเขียน ยิ่งเลอะ.....

เขียนที่บ้านพัก 15/09/2564 เวลา 3:00



 

 

 




 

 

 



 











 



MAPs

วันก่อนได้ลองเขียนแบบ แบบตัวนั้นมันต้องแนบแผนที่สังเขปของโครงการ ลองๆ แล้วก็ใช้ snazzymaps แล้วก็เอามาทำต่อใน inkscape มันก็ออกมาดูได้ระดับห...