2017年2月11日 星期六

open ssh on openwrt

Ref : http://www.it-slav.net/blogs/2011/04/02/open-ssh-on-the-wan-inteface-openwrt/


config rule                
        option src              wan
        option dest_port        22
        option target           ACCEPT     
        option proto            tcp 



reset firewall

/etc/init.d/firewall restart

接下來就可以用 putty 軟體用 ssh的方式連進來.

python thread

Ref :  https://puremonkey2010.blogspot.tw/2012/07/python-python-threading.html

mqtt install

Ref :  http://www.slideshare.net/EllingtonSu/mqtt-61900840

Ref : http://rocksaying.tw/archives/2016/MQTT-3-Python-clients.html


Ref : https://makerpro_taiwan.gitbooks.io/lass-7688-duo-pm2-5-remote-controller/content/cong_linux_duan_qu_de_mqtt_zi_liao_fen_feng_chuan_.html

default port : 1883/ 8883 (TLS)



先確定有沒有pip

easy_install pip

opkg install python-openssl

pip install paho-mqtt


===============================================
pub
================================================




中間的server 是 Broker...

device 自己可以當 Publusher (類似Tx)...  也可以當  Subscriber(類似Rx)












2017年2月7日 星期二

7688 用指令切換 sta mode

Ref :  https://medium.com/maker-cup/smart-7688-duo-ap-station-mode-command%E7%9A%84%E5%88%87%E6%8F%9B%E8%88%87%E8%A8%AD%E5%AE%9A-e8da97b7b332#.3hpmjvld7



# uci set wireless.sta.ssid=MyAP       (AP的SSID)
# uci set wireless.sta.encryption=psk2 (加密模式)
# uci set wireless.sta.key=12345678    (AP密碼)
# uci set wireless.sta.disabled=0      (將stationMode打開)
# uci commit
# wifi

2016年9月5日 星期一

2016年8月13日 星期六

7688 i2c & arduino slaver code



Ref : https://docs.labs.mediatek.com/resource/linkit-smart-7688/en/tutorials/peripheral-support-on-linkit-smart-7688-development-board/mraa






















P20  ->   I2C  SDA

P21   ->  I2C  SCK



使用MRAA為library..... 系統預設已經裝好...

MRAA

libmraa is a C/C++ library to interface with the peripherals on LinkIt Smart 7688 development board. libmraa is pre-installed in the system image of the board and supports C++, Python and Node.js bindings.

Basic concepts

The majority of hardware modules such as GPIO, UART, SPI and PWM are represented as objects. These modules are initialized on certain pins that are identified by pin numbers. The pin numbers in the libmraa on the board are identical to the GPIO numbers in the data sheet and in the Linux GPIO subsystem.
The following Python example creates GPIO object on GPIO pin 2: 
import mraa
pin = mraa.Gpio(2)    # Initialize GPIO2 (P10 on LinkIt Smart 7688 board)

I2C

Inter-Integrated Circuit (I2C) is a widely used protocol among peripherals. It consists of 2 signal pins — usually named SDA and SCL. LinkIt Smart 7688 development board has one set of I2C on GPIO4 (P21) and GPIO5 (P20) as SCL and SDA, respectively. The way I2Cs are initialized is slightly different from GPIO modules. Instead of using pins, I2Cs are initialized based on the device index. Since there is only one set of I2C master device on the board, you can simply pass 0, and it's always on pins GPIO4 and GPIO5.
import mraa 
i2c = mraa.I2c(0) 
I2C is capable of connecting multiple slave devices to a single I2C master. Each slave device is identified by a 7-bit address. The following example scans for a Seeed Studio 3-Axis Digital Accelerometer attached to the LinkIt Smart 7688 development board by reading the device ID from its registers.
import mraa
 
i2c = mraa.I2c(0)
# Grove - 3-Axis Digital Accelerometer(+-16g)
# is a ADXL345 configured to I2C address 0x53.
i2c.address(0x53)
# The device ID should be 
if 0xE5 == i2c.readReg(0x00):
 print "Grove - 3-Axis Digital Accelerometer found on I2C Bus"
else:
 print "Grove - 3-Axis Digital Accelerometer not found" 


mraa 在 i2c 下面用的 api 

address(I2c selfuint8_t address) → mraa::Result[source]
address: uint8_t
frequency(I2c selfmraa::I2cMode mode) → mraa::Result[source]
mode: enum mraa::I2cMode
read(I2c selfuint8_t * data) → int[source]
data: uint8_t *
readByte(I2c self) → uint8_t[source]
self: mraa::I2c *
readBytesReg(I2c selfuint8_t reguint8_t * data) → int[source]
reg: uint8_t data: uint8_t *
readReg(I2c selfuint8_t reg) → uint8_t[source]
reg: uint8_t
readWordReg(I2c selfuint8_t reg) → uint16_t[source]
reg: uint8_t
write(I2c selfuint8_t const * data) → mraa::Result[source]
data: uint8_t const *
writeByte(I2c selfuint8_t data) → mraa::Result[source]
data: uint8_t
writeReg(I2c selfuint8_t reguint8_t data) → mraa::Result[source]
reg: uint8_t data: uint8_t
writeWordReg(I2c selfuint8_t reguint16_t data) → mraa::Result[source]
reg: uint8_t data: uint16_t


======================================================
Ref  wire ->  slaver_reader sample

// Wire Slave Receiver
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Receives data as an I2C/TWI slave device
// Refer to the "Wire Master Writer" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop() {
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

=============================================
slaver_sender


#include <Wire.h>

void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event
}

void loop() {
  delay(100);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  Wire.write("hello "); // respond with message of 6 bytes
  // as expected by master
}













2016年8月9日 星期二

Jlink 研究

Ref :   https://applefreak111.wordpress.com/2013/03/07/howto-stm32%E6%96%B0%E6%89%8B%E4%B8%8A%E8%B7%AF-%E4%BD%BF%E7%94%A8keil%E5%92%8Cjlink/

Ref :  https://www.youtube.com/watch?v=Bm48FabZ3sE

大家好 今天我要跟各位初步介紹如何使用Keil來開發ST的STM32 ARM微處理器 那麼我們就廢話不多說 直接進入話題吧!
還是說一下廢話好了 ㄏㄏ STM32總共分有F0, F1, F2, F3, F4五個系列 每個系列的用途不同 所以功能也不同 我想各位應該也猜到越後面的能力就越強吧 至於選擇F1系列的原因是因為他的功能已經非常強了 舉個例,Sony的PlayStation Move裡面就使用了STM32F103VB這顆晶片 由此可知他的應用
當然很多控制的應用也可以取代8051 但這恐怕就有點殺雞焉用牛刀的感覺了 總之要看應用就是了 順道一提 用8051不如用AVR 封裝大小從PDIP8到PDIP28都有 我也還沒開始學 先玩STM32一陣子吧
首先呢 各位需要安裝Keil-MDK 這將會是我們的IDE(integrated development environment) 這套軟體把文字編輯器、編譯器、下載燒錄、及除錯全部包裝在一起 非常好用也省事
安裝的部分沒有什麼好解釋的 請各位自行先裝好 也請裝好JLink的驅動 如果有任何問題就留言發問吧
現在我們有了一切需要的工具 當然也少不了硬體啦 我用的是很簡易的開發板 對岸稱為最小系統板 這裡有個重要的事情要注意 就是你的STM32是哪個系列的哪個型號 例如我的是STM32F103RB 意味著他是F1係列的03RB 其功能我想各位自己讀讀datasheet就可以瞭解 我這就不多說了 唯一要注意的就是你的晶片是HD還是MD 這是什麼勒?就是裡面的flash記憶體大小 這個大小就是我們程式最大的容量 關於怎麼樣才是HD怎麼樣才是MD這個分別我有點點忘了 總之根記憶體大小有關就是了
對一位新手(我也是) 要學習STM32依據本人的經驗 他的學習曲線非常的陡 為什麼呢?因為相關的教學資料少之又少 書也沒幾本 我一開始學的時候停頓了超久才開竅 因為其實 他根本不用書就可以學了!一切的資料都在datasheet和reference manual(RM0008)內 只要能掌握這兩本(還有std_peripheral使用說明,但我不常用)就可以輕輕鬆鬆學會了STM32!

好啦~講了那麼多廢話…我們開始吧!首先我們需要建構好Keil的環境 各位可以來下載我事先做好的空白範本 因為其實ST也是希望大家這樣開發 不然每次都要重新設定路徑有的沒的 不省事
各位應該已經確認自己的晶片是HD還是MD 我的是MD 所以就複製一個範本 然後命個名好了之後就請開啓Project.uvproj吧 應該會長這樣


在main函數裡面就是我們寫主程式的地方 這和其他晶片是沒有兩樣的 現在裡面只有一個while的dummy回圈 沒啥用 等等我會講解STM32程式的開發的流程 因為這會和ARM的架構有點關係 所以我先稍稍講一下他的架構(這個時候你應該有RM0008和晶片的datasheet都打開 隨時都可以參考 這很重要) 我們來看看datasheet(以我的為例 也就是ST的CD00161566)的第11頁的block diagram 這大約就是我這顆晶片的運作方塊圖 看到下半邊 有一堆功能 ADC, GPIO, TIM, USART…etc. 等 這些都是我這顆晶片所擁有的功能 我們要啓用它 來使用他們,給他們clock 就可以使用了 當然我們還要進一步的填入這個功能的初始參數 例如你要啓用GPIOA 而裡面的參數有mode, pin,和speed 這些參數就和8051一樣 都有對應的register來作設定 STM32功能強大的地方來了 因為ARM的結構非常的複雜 所以ST已經寫好了一整套的Library 把所有低階的程式都抽象化掉了 這個Libray稱為Standart Peripheral Libray或Firmware Library中文我們就叫做硬體庫吧(因為我也不知道怎麼翻) 而這個library又建構於ARM公司所發行的CMSIS這個library 在這我只是簡介一番 因為實際我們在開發的時候 根本不用理會 只要知道怎麼寫C還有使用硬體庫就好了
整合一下剛剛所說的,如果我今天想要用GPIOA (General Purpose Input/Output,通用輸入/輸出 A的意思是A區塊 有A就有B 有B就有C 以此類推 已GPIO來講 一個區塊有16個輸入輸出單位) 我可以用下列的函數來進行設定
GPIO_InitTypeDef GPIO_InitStructure; //定義資料形態
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //啟用APB2 Peripheral的clock(這個是翻成”外設”?)
/*以下為GPIO參數設定*/
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0; //設定Pin_0也就是GPIOA的P0
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_out_PP; //設定為輸出push-pull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始
由上可知,這個硬體庫都是使用自己的資料形態 然後使用者在來定義內部的欄位 就可以進行register的設定 簡單吧!現在GPIOA已經設定完了 我們現在要怎麼使用他勒?讓我們看下去
如果想要Set某支腳我們只要呼叫這個函數
GPIO_SetBits(GPIOA , GPIO_Pin_0);
如果想要Reset某支腳
GPIO_ResetBits(GPIOA , GPIO_Pin_0);
所謂sink 就是電流是由外部“流入”晶片 反之,source就是晶片“提供”電流給外部 這有什麼差勒?差可大囉!
如果我電路想接一顆LED 我可以把LED的正極直接接到晶片的輸出腳(當然要限流電阻) 然後晶片只要給high的訊號(3.3v or 3v3)LED就會亮了 對吧?但想想喔 如果他要提供電流 這隻腳 晶片就會有負載 有了負載溫度就高 若電流更大 就推不動了
但如果我們用sink,我們將腳設low (0v, GND)電流是從外部流入晶片到地 所以晶片沒有消耗到功率 大部份的驅動 都是採sink的方式 但如果一定要由晶片提供high訊號(七段顯示器掃描,LED陣列掃描) 我們會使用電子開關 例如在飽和區的BJT
剛剛介紹完怎麼啟用某個功能 我們現在就來看看怎麼作出一個LED流水燈吧!流水燈聽起來有點拔辣 這也是對岸的講法 其實就是某幾顆LED互相交替點亮熄滅 等同於控制晶片的Hello World
延續剛剛的main函數內 我們先創一個叫做GPIOA_Init(void)的函數吧 裡面我們會初始化GPIO這個功能
然後在main裡呼叫他 進行初始化 然後依序點亮和熄滅

我的板子LED剛好在PB0上 而且使用了source 所以我這樣寫
之後就按下”Build”來編譯 沒有問題後”Downoad”來下載到晶片內 因為我設定下載後自動reset所以功能在下載完成後馬上就可以動作了!這個功能 看每個人喜好 在一些比較複雜的應用我會想要自己按板子上的Reset扭來重設 這個設定可以在”Target Options”(有一個魔術棒的圖樣) 裡面的”Utilities”內的”Settings”內的”Download Options”找到 “Reset and Run”
圖四
我想初步介紹STM32及開發的方法到這邊就告一段落了 相信各位都覺得不難 因為真的不難!我自己卡關大部份都是在程式的流程設計還有資料的處理這方面卡關 但這些問題都是因為寫的程式不多所造成的 無聊的時候就想個功能 挑戰挑戰自己 經驗日積月累 就可以越來越厲害了!希望各位有學到東西 或者如果我有哪裡和你的認知不同請都提出來讓我們一起解決 畢竟我也是新手 只是比你們早玩罷了 請多指教囉~謝謝!