2017年8月30日 星期三

[新手教學] ARM boot Loader 數位課程學習須知



 教學影片內容為ARM 微理機架構解說與ARM Boot Loader 等技術主題的說明並有講師Demo Pi 3影片

目標對象:
  1. 有嵌入式系統開發經驗但並未接觸過底層開機程式碼 (Boot code)

先備知識: 

  1. Linux 系統操作能力
  2. 熟悉的C程式
  3. 會使用gcc, make 的等GNU開發工具
  4. Raspberry Pi 的操作使用經驗
Raspberry Pi 3 環境建置:


請先登入學習平台,在[課程公告]處, 點選下載ARM Files.rar ,解開後內容如下

ARM Files 檔案目錄結構:
├─ADS_code  (ADS 課程範例原始碼)
├─Document (Data Sheet及電路圖等文件)
├─Tools
│  ├─2016-05-27-raspbian-jessie-lite.zip (Raspberry Pi 3官方Image File)
│  ├─ADS12trial.rar (ADS 1.2 試用版)
─pi-boot.zip (Raspberry Pi Bootloader  課程範例原始碼)
├─TOC.tx

其中 pi-boot.zip 要傳送到PC Linux下 (註: 講師用的Linux環境是 Ubuntu 16.04, 但其實只要Toolchain能執行就可以,和使用那一套Linux Distribution並無太大關聯) ( 延伸閱讀: 用VirtualBox 掛載 Linux )





ARM bootloader on Raspberry Pi 3 
=====================================

在 Linux 下 執行 "unzip  pi-boot.zip" , 解開後的內容如下, 請照README.txt 或下方說明, 完成第一個Pi上的範例

  
pi-boot
  │  gcc-arm-none-eabi-5_3-2016q1-20160330-linux.tar.bz2
  │  gcc-arm-none-eabi-6-2017-q1-update-linux.tar.bz2
  │  make.dep
  │  README.txt
  ├─bcm2835_lib
  ├─example
  │   ├─bare_button
  │   ├─bare_button_in
  │   ├─bare_gpio
  │   ├─bare_mailbox
  │   ├─bare_timer
  │   ├─bare_uart_poll
  │   └─uart_interrupt
  └─startup_code
          boot.o
          boot.S
          link.ld
          Makefil
          start.o
          start.S

How to Build
------------------------
step1: untar Toolchain
------------------------
gcc-arm-none-eabi-5_3-2016q1.tar.gz --> for 32-bit Linux host  
gcc-arm-none-eabi-6-2017-q1-update-linux.tar.bz2 --> for 64-bit Linux host


For example, 

tar jxvf gcc-arm-none-eabi-6-2017-q1-update-linux.tar.bz2 

-------------------------
step2: Setup Toolchain Path
-------------------------

export PATH=$PATH:/home/it/pi_baremetal/trunk/gcc-arm-none-eabi-6-2017-q1-update/bin

type "arm-none-eabi-gcc -v"

it will display : gcc version 6.3.1 


-------------------------
step3: make boot code firstly
-------------------------

#modify make.dep to determine which version to use
# 0 for 32bit ; 1 for 64
Host_64=1

cd startup_code ; make


-------------------------
step4: test demo code
-------------------------


cd example/bare_gpio
make

output==>armgpio.bin

-------------------------
step5: put the code to Raspberry Pi 3
-------------------------

 copy 'armgpio.bin' to micro SD card and add one line 

 kernel=armgpio.bin

at the end of the config.txt file. Then, you insert micro SD card into Raspberry Pi,and power on. After booting, you can see LED is blinking.


 Note: code 在Pi 3上測試過
      目前講師所整理的code 僅以Raspberry Pi 3 搭配艾鍗 Raspberry Pi 3 Shield 版本為主







2017年8月23日 星期三

Python 入門學習快速筆記 (六)


例外處理 try: ... excpet:



a=100
b=10

try:
    c=a/b
    print("c=",c)
except:
    c=-1
    print("Divdie by zero")
    print("c=",c)

print("c=",c)

------------------
try-except 也可以和 else 連用, else 後的程式區塊放的是沒有發生例外,程式所執行的工作,例如
try:
    c=a/b
    print("c=",c)
except:
    c=-1
    print("Divdie by zero")
    print("c=",c)
else:
    print("No exception")
-----------------------------------------------
例外的名稱也可以寫在 except 之後,如
try:
    c=a/b
    print("c=",c)
except ZeroDivisionError:
    c=-1
    print("Divdie by zero")
    print("c=",c)
except NameError:
except TypeError:
except IndexError:

-----------------------------
若加入另一個關鍵字 finally ,無論例外有沒有發生都會執行 finally 後的程式區塊
try:
    c=a/b
    print("c=",c)
except ZeroDivisionError:
    c=-1
    print("Divdie by zero")
    print("c=",c)
except NameError:
except TypeError:
except IndexError:
findally:

--------------------------

Raise 觸發Exception Error


try:
raise NameError
     
except NameError:
        print("發生例外,NameError")
except ZeroDivisionError:
print("發生例外,ZeroDivisionError")


print("after exception....")

Python 所有Exception
https://docs.python.org/3/library/exceptions.html#exception-hierarchy



Python檔案處理


file = open('dream.txt', 'r', encoding='UTF-8')

li=file.readlines()
print(li[3],end='')



Python 第三方套件



https://pypi.python.org/pypi?:action=browse&c=533&show=all

安裝 Python 第三方套件-使用pip 工具
C:\Python34\Scripts>pip install pyqrcode

Collecting pyqrcode
  Downloading PyQRCode-1.1.tar.gz
Building wheels for collected packages: pyqrcode
  Running setup.py bdist_wheel for pyqrcode
  Stored in directory: C:\Users\student\AppData\Local\pip\Cache\wheels\03\93\7f\
d3a38165d01798524d99329a6aabba2b378d81da1d46f15b36
Successfully built pyqrcode
Installing collected packages: pyqrcode
Successfully installed pyqrcode-1.1

C:\Python34\Scripts>pip install pypng


#-*-coding:UTF-8 -*-
#  EX08_01.py
#  
#  pyqrcode 使用範例
#  
from pyqrcode import QRCode
url = QRCode('http://www.ntu.edu.tw')
#輸出SVG格式檔案:url.svg ,縮放比為10
url.svg('url.svg', scale=10)
#輸出PNG格式檔案:url.png ,縮放比為10

url.png('url.png', scale=10)






PT100 溫度感測器



電阻系數

對於一般物體,電阻R,電阻率p、長度 L 與截面積A之間的關係如下:
在上式中,
  • 電阻 R單位為歐姆
  • 長度 L單位為米
  • 截面面積 A 單位為平方米
  • 電阻率 p 單位為歐姆·米
這個方程被稱為電阻定律。

由於 p 很小, 所以A 導線截面積要很小, 才會有R (電阻)可以量, 不然沒有R的訊號

電阻與溫度的關係

電阻率一般會隨溫度變化而變化。在溫度變化不大時,電阻率p與溫度之間存在線性關係:
pt=p0(1+aT)
其中 P0是該材料在0攝氏度時的電阻率,Pt是T攝氏度時的電阻率,a是電阻率的溫度係數。 a在溫度變化不大的範圍內可以認為是常量。多數金屬常溫下的電阻率溫度係數a 約為0.004。 

PT100


大部分電阻式溫度感測 器是以金屬作成的,其中以鉑(Pt)作成的電阻式溫度檢測器,最為穩定-耐酸堿、不會變 質、相當線性...,最受工業界採用。  

PT100 溫度感測器是一種以鉑(Pt) (俗稱白金)作成的電阻式溫度感測器,屬於正電阻係數,其電阻和 溫度變化的關係式如下:R=Ro(1+αT)     其中α=0.00392,Ro 為 100Ω (在 0℃的電阻值),T 為攝氏溫度,因此白金作成的電阻式溫度感測器,又稱為 PT100

PT100 溫度感測器 0℃時電阻值為 100Ω,電阻變化率為 0.3851Ω/℃。

pt100 的積體電路,要注意 的是這個積體電路採集的不是電流信號,而是電阻值。

PT100 原理及分度表 電阻式溫度感測器(RTD,Resistance Temperature Detector)-一種物質材料作成的電阻,它 會隨溫度的上升而改變電阻值,如果它隨溫度的上升而電阻值也跟著上升就稱為正電阻 係數,如果它隨溫度的上升而電阻值反而下降就稱為負電阻係數。

參考:

http://www.dmatek.com.tw/tn/download/SensorData_E390.pdf


2017年8月17日 星期四

嵌入式系統常用的通訊協定-RS485/Modbus



RS485:
  • 為半雙工(同一時間只能選擇傳送或接收的動作)
  • 為差動傳輸,使用纜線兩端(D+、D-)的電壓差來表示傳遞訊號
  • 常用於單機傳送(Master),多機接收(Slave)的通訊鏈結。可將數個感應裝置的數值回傳給Master
Modbus over RS485:
  • Modbus是一種串列通訊協定
  • Modbus為master/slave架構。一個裝置為Master節點,其他節點為slave。
  • 每一個slave裝置都有一個唯一的位址/ID (1~247)
  • Since a single byte is normally used to define the slave address and each slave on a network requires a unique address, the number of slaves on a network is limited to 256. The limit defined in the modbus specification is even lower at 247.
  • master和slave之間走的Modbus 協定其封包格式有分ASCII 或RTU兩種
  • ASCII 為文字模式, 用character 傳送, RTU 為binary 模式傳送
  • 封包格式:   Slave ID  | Function Code | Data | CRC
RTU 訊息格式
  • Information is stored in the Slave device in four different tables.
  • Two tables store on/off discrete values (coils) and two store numerical values (registers). The coils and registers each have a read-only table and read-write table.
  • Each table has 9999 values.
    Each coil or contact is 1 bit and assigned a data address between 0000 and 270E.
    Each register is 1 word = 16 bits = 2 bytes and also has data address between 0000 and 270E.

Coil/Register Numbers
Data Addresses
TypeTable Name
1-9999
0000 to 270E(9999)
Read-WriteDiscrete Output Coils
10001-19999
0000 to 270E
Read-OnlyDiscrete Input Contacts
30001-39999
0000 to 270ERead-OnlyAnalog Input Registers
40001-49999
0000 to 270ERead-WriteAnalog Output Holding Registers

Coil/Register Numbers can be thought of as location names since they do not appear in the actual messages. The Data Addresses are used in the messages.For example, the first Holding Register, number 40001, has the Data Address 0000. The difference between these two values is the offset.
Each table has a different offset. 1, 10001, 30001 and 40001.

只有Data Address(Offset)才出現在送出的Message 中, 如何知道查的是那一張表呢?
答案是利用Function Code 來決定


What is a function code?

The second byte sent by the Master is the Function code. This number tells the slave which table to access and whether to read from or write to the table.

Function Code (Command) 3 is to read 4xxx registers, and  4 for 3xxx registers. 

Function CodeActionTable Name
01 (01 hex)ReadDiscrete Output Coils
05 (05 hex)Write singleDiscrete Output Coil
15 (0F hex)Write multipleDiscrete Output Coils
02 (02 hex)ReadDiscrete Input Contacts
04 (04 hex)ReadAnalog Input Registers
03 (03 hex)ReadAnalog Output Holding Registers
06 (06 hex)Write singleAnalog Output Holding Register
16 (10 hex)Write multipleAnalog Output Holding Registers

Example: 


Read Holding Registers (FC=03)
Request
This command is requesting the content of analog output holding registers # 40108 to
 40110 from the slave device with address 17.
11 03 006B 0003 7687
11: The Slave Address (11 hex = address17 )
03: The Function Code 3 (read Analog Output Holding Registers)
006B: The Data Address of the first register requested.
             ( 006B hex = 107 , + 40001 offset = input #40108 )
0003: The total number of registers requested. (read 3 registers 40108 to 40110)
7687: The CRC (cyclic redundancy check) for error checking.
Response
11 03 06 AE41 5652 4340 49AD
11: The Slave Address (11 hex = address17 )
03: The Function Code 3 (read Analog Output Holding Registers)
06: The number of data bytes to follow (3 registers x 2 bytes each = 6 bytes)
AE41: The contents of register 40108
5652: The contents of register 40109
4340: The contents of register 40110
49AD: The CRC (cyclic redundancy check).


Read Coil Status (FC=01)

Request
This command is requesting the ON/OFF status of discrete coils # 20 to 56
from the slave device with address 17.
11 01 0013 0025 0E84

11: The Slave Address (11 hex = address17 )
01: The Function Code 1 (read Coil Status)
0013: The Data Address of the first coil to read.
             ( 0013 hex = 19 , + 1 offset = coil #20 )
0025: The total number of coils requested.  (25 hex = 37,  inputs 20 to 56 )
0E84: The CRC (cyclic redundancy check) for error checking.
Response
11 01 05 CD6BB20E1B 45E6
11: The Slave Address (11 hex = address17 )
01: The Function Code 1 (read Coil Status)
05: The number of data bytes to follow (37 Coils / 8 bits per byte = 5 bytes)
CD: Coils 27 - 20 (1100 1101)
6B: Coils 35 - 28 (0110 1011)
B2: Coils 43 - 36 (1011 0010)
0E: Coils 51 - 44 (0000 1110)
1B: 3 space holders & Coils 56 - 52 (0001 1011)
45E6: The CRC (cyclic redundancy check).
The more significant bits contain the higher coil variables. This shows that coil 36 is off (0) and 43 is on (1). Due to the number of coils requested, the last data field1Bcontains the status of only 5 coils.  The three most significant bits in this data field are filled in with zeroes.





RS485 模組 (MAX485)的Pin 腳定義:


  • pin 1 :RO (receive out)
  • pin 2 RE (receive enable) 
  • pin 3 :DE (data enable) 
  • pin 4 :DI (data in)
  • pin 5, pin 8 :  Gnd  and Vcc onnected
  • pin 6,7 : A and B  the RS485 pair

RO------->UART TX
DI<------- UART RX

把/RE and DE 短路, 然後MCU/Pi 用一根GPIO 決定 /RE 或 DE.(即是決定是在送還是在收的狀態, 因為RS485是單工)















讀出來若是以Float 表示, 則需進行轉換成十進制

須考慮 Byte ordering的問題!

http://www.61131.com/download.htm






 AQUAS-SR04











相關文章: 


2017年8月9日 星期三

凸函數-Convex Function




凸集是指有這麼一個點的集合,其中任取兩個點連一條直線,這條線上的點仍然在這個集合內部,因此說「凸」是很形象的。例如下圖,對於凸函數(在數學表示上,滿足約束條件是仿射函數,也就是線性的Ax+b的形式)來說,局部最優就是全局最優,但對非凸函數來說就不是了。二次表示目標函數是自變量的二次函數。4




原文網址:https://read01.com/BQ45kj.html



2017年8月8日 星期二

[新手教學] Linux Driver 數位課程學習須知



 教學影片內容為Linux Driver 觀念解說與各Linux Driver 技術主題的說明並有講師Demo Pi 3影片


先備知識: 

  1. 具Linux 系統操作能力 (cd, cp , tar , sudo, ifconfig 這些指令的使用是常識 )
  2. 熟悉C程式設計
  3. 會使用gcc, make 的等GNU開發工具
  4. 有Linux 系統程式設計的經驗
Raspberry Pi 3 環境建置:


請先登入學習平台,在[課程公告]處, 點選下載 image , 此為艾鍗 Linux Driver 上課用 image (已有將上課範例及核心原始碼都放進去了)

請先解開 rar 壓縮檔, 然後再用WinDisk工具寫入至 16G MicroSD 卡中

開機後, pi 登入, 密碼: raspberry 

登入後,可先進入 01_LED , 執行動入如下

make  ==> 產生chr_led.ko的檔案

insmod chr_led.ko  ==> 載入driver

gcc test.c -o test  ==> 產生應用程式執行檔  test

sudo ./test ==> 執行應用程式, 可以看到LED 閃爍



2017年8月7日 星期一

常常弄不清楚的 CSS Selector



CSS class definition with multiple identifiers

常常弄不清楚的 CSS Selector
  • .class1.class2 will match only the elements that have both of them classes defined.
    .class1.class2 { background: red; }
    <div class="class1 class2"></div>
  • .class1, .class2 will match the elements with .class1 or .class2
    .class1, .class2 { background: yellow; }
    <div class="class1"></div>
    <div class="class2"></div>
  • .class1 .class2 will match only the elements with class2 within elements with class1.
    .class1 .class2 { background: blue; }
    <div class="class1">
        <div class="class2"></div>
    </div>

善用工具: 

開Chrome瀏覽器 F12 開發者工具偵察現有的網頁 CSS 樣式規則,判斷產生該效果的 CSS 樣式設定來源



2017年8月6日 星期日

Pi 新手教學(三) ---使用SSH登入Raspberry Pi




使用SSH登入Raspberry Pi


  1. 先碓認 Pi 和 PC之間網路必須能連通, 可以用 ping <IP位址>


    ***在Raspberry Pi 使用WiFi***

    sudo raspi-config   進入[Network Options]  --> Wi-Fi

    * 設定國碼 TW Taiwan 
    * 欲連結 AP 的SSID 名稱
    * WiFi 密碼



  2. 同時再確認: Pi 本身的SSH 服務必須是開啓的 (一般來說應該都是開啓的), 可以使用 netstat -atn 查看是否SSH 處於listen 狀態 (tcp port: 22)


  Note: 官方最新版的Image預設是沒有SSH 啓動的,所以得自己去開啓它


HTML Color Codes


HTML Color Codes

1在CSS中常常須要設定顏色, 例如要設定 background-color: #4CAF50; 常常須要RGB色碼, 可以到這裡去找快速查詢





2) 若是想要知道某一個圖所用的"顏色", 不知道色碼時怎麼辦 ? 可以先 [Print Screen] , ,再用小畫家, 用"點滴"查看color