網頁

2017年12月18日 星期一

使用 Arduino Pro Micro 當成 Arduino ISP 燒錄程式到 Atmega328P-PU 之二

請參考 上一篇 和 From Arduino to a Microcontroller on a Breadboard

雖然他只有提供 breadboard-1-6-x.zip,並沒有 1.8.5 的版本,是可以用的
秘訣是 Arduino IDE 不要使用安裝檔,使用 Windows zip file for non admin install
解開後取出 boards.txt 的內容加入 arduino-1.8.5 的 boards.txt
之前使用安裝檔,一直失敗

C:\Arduino\arduino-1.8.5-windows\arduino-1.8.5\hardware\arduino\avr\boards.txt
##############################################################
atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock)

atmega328bb.upload.protocol=arduino
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600

atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05

atmega328bb.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F

atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard

##############################################################

參考 上一篇 ProMicro 到 Atmega328P 接線
先燒錄 Bootloader
Tools/Board:ATmega328 on a breadboard (8 MHz internal clock)
Tools/Port 選正確
Tools/Programmer/Arduino as ISP(Pro Micro)
Tools/Burn Bootloader

Bootloader 燒錄完成後,即可透過 RS-232 燒錄程式
USB轉RS-232(如 FT232RL)
FTDI  ->  Atmega328P
GND  ->  GND
CTS  ->  GND
VCC  ->  VCC
TXO  ->  2(RXD)
RXI  ->  3(TXD)
DTL  -> 1(RESET)

DTL 接 RESET 請參考 Arduino Pro Mini 電路
中間串接 0.1uF, Atmega328P 端的 Reset 要 Pull Up 10K

Tools/Board:ATmega328 on a breadboard (8 MHz internal clock)
Tools/Port 選RS-232 的 Port
Sketch/Upload (不要 Using Programmer)


2017年12月12日 星期二

使用 Arduino Pro Micro 當成 Arduino ISP 燒錄程式到 Atmega328P-PU

Arduino 1.8.5

File/Preferences/Additional Boards Manager URLs
https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json
Tools/Board/Boards Manager
安裝 SparkFun AVR Boards

修改 File/Examples/11.ArduinoISP/ArduinoISP
重新定義下列程式碼
#define RESET     10 // Use pin 10 to reset the target rather than SS
#define LED_HB    9
#define LED_ERR   8
#define LED_PMODE 7
#define PIN_SCK   15
#define PIN_MOSI  16
#define PIN_MISO  14
Tools/Board/SparkFun Pro Micro
Tools/Processor/Atmega32U4(5V,16MHz)
Tools/Port/(選正確 Com)
Sketch/Upload

主要接線
ProMicro  ->  Atmega328P-PU
VCC  ->  7(VCC)
GND  ->  8(GND)
VCC  ->  20(AVCC)
15(SCK)  ->  19(SCK)
14(MISO)  ->  18(MISO)
16(MOSI)  ->  17(MOSI)
10  ->  1(RESET)
File/Preferences/Additional Boards Manager URLs
https://github.com/Optiboot/optiboot/releases/download/v6.2/package_optiboot_optiboot-additional_index.json
Tools/Board/Boards Manager
安裝 Optiboot 6.2
若找不到, 並且有錯誤訊息
Error downloading https://github.com/Optiboot/optiboot/releases/download/v6.2/package_optiboot_optiboot-additional_index.json
下載並置於
C:\Arduino\arduino-1.8.5-windows\arduino-1.8.5\hardware/package_optiboot_optiboot-additional_index.json
更改 File/Preferences/Additional Boards Manager URLs 為
file://C:\Arduino\arduino-1.8.5-windows\arduino-1.8.5\hardware/package_optiboot_optiboot-additional_index.json

修改 C:\Arduino\arduino-1.8.5-windows\arduino-1.8.5\hardware\arduino\avr\programmers.txt
增加
arduinopromicro.name=Arduino as ISP(Pro Micro)
arduinopromicro.communication=serial
arduinopromicro.protocol=arduino
arduinopromicro.speed=19200
arduinopromicro.program.protocol=stk500v1
arduinopromicro.program.speed=19200
arduinopromicro.program.tool=avrdude
arduinopromicro.program.extra_params=-P{serial.port} -b{program.speed}

Tools/Programmer/Arduino as ISP(Pro Micro)
Tools/Processor/Atmega328p
Tools/Board/Optiboot on 28-pin cpus
Tools/CPU Speed/8MHz (int) (不使用外部震盪晶體)
Tools/Burn Bootloader (好像可以不用,但是時脈會錯誤)
燒錄程式需使用 Sketch/Upload Using Programmer, 不能使用 Upload

2017年11月24日 星期五

如何控制 DC-DC 輸出電壓

以下文章參考 Output voltage control of DC/DC converters

Vref 固定,且沒有電流
期望輸出電壓範圍 Vo1 ~ Vo2 (Vo1 < Vo2)
期望控制電壓範圍 Vc2 ~ Vc1(Vc1 < Vc2)
即是 Vc1 輸出 Vo1,Vc2 輸出 Vo2
以中間的節點來說 Ir1 + Ir2 + Ir3 = 0
Vref/R3 + (Vo1 - Vref)/R1 + (Vc1 - Vref)/R2 = 0
Vref/R3 + (Vo2 - Vref)/R1 + (Vc2 - Vref)/R2 = 0
因為 R3 固定,所以可以由聯立方程式解出 R1, R2

在上述範例中使用 LM2596(降壓),我使用 TL431(升壓)
須注意上方的電阻值,至少要能提供 TL431 1mA,才能正常工作

原先是想用 LM317-ADJ(降壓)
Vout = 1.25(1 + R2/R1)
請注意此時的 Vref = Vout - Vadj = 1.25
Vref/R1 + [Vc1 - (Vo1 - Vref)]/R2 + (Vo1 - Vref)/R3 = 0
Vref/R1 + [Vc2 - (Vo2 - Vref)]/R2 + (Vo2 - Vref)/R3 = 0
以上沒有試過,請小心

沒猜錯 XL6003(升壓) 也可以

2017年9月15日 星期五

Arduino pro mini

1. 製造 Arduino 燒錄器
接腳 FT232RL -> Arduino Pro Mini
DTR->DTR
RX->TXO
TX->RXI
VCC->VCC
CTX->GND
GND->GNC

選擇要當燒錄器的 Boards(Arduino Pro or Pro Mini) 和 Port
File/Examples/11.ArduinoISP/ArduinoISP
Sketch/Upload

2. 燒錄 bootloader
接腳 Arduino Pro Mini(Arduino 燒錄器)->Arduino Pro Mini
VCC->VCC
GND->GND
10->RST
11(MOSI)->11(MOSI)
12(MISO)->12(MISO)
13(SCK)->13(SCK)

File/Examples/01.Basics/Blank
選擇目標 Boards(Arduino Pro or Pro Mini)
Tools/Programmer/Arduino as ISP
Tools/Brun Bootloader
Sketch/Upload Using Programmer

2017年9月5日 星期二

SSL, RaspberryPi Server, Android Client

請參考 Android 與 Raspberry 證書 和 SSL 網路程式設計 的 Server 端
在此提供 Android 的 Client

package com.example.mark.sslclient;

import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;

/** * Created by mark on 2017/9/1. */
public class SSLClient {
    static SSLContext ssl_ctx;

    public SSLClient(Context context) {
        try {
            Log.d("SSLClient", "SSLClient");

            //  Setup truststore            KeyStore trustStore = KeyStore.getInstance("BKS");
            InputStream trustStoreStream = context.getResources().openRawResource(R.raw.android);
            trustStore.load(trustStoreStream, "store1234".toCharArray());
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(trustStore);
            Log.d("SSLClient", "Trust " + trustStore.size());
            Log.d("SSLClient", "trustManagerFactory " + trustManagerFactory.getTrustManagers().length);

            //  Setup keystore            KeyStore keyStore = KeyStore.getInstance("BKS");
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            InputStream keyStoreStream = context.getResources().openRawResource(R.raw.android);
            keyStore.load(keyStoreStream, "store1234".toCharArray());
            keyManagerFactory.init(keyStore, "key1234".toCharArray());
            Log.d("SSLClient", "Key " + keyStore.size());
            Log.d("SSLClient", "keyManagerFactory " + keyManagerFactory.getKeyManagers().length);

            // Setup the SSL context to use the truststore and keystore            ssl_ctx = SSLContext.getInstance("TLS");
            if (true) {
                ssl_ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
            } else {
                TrustManager tm = new X509TrustManager() {
                    public void checkClientTrusted(X509Certificate[] chain, String authTyhpe) throws CertificateException {
                    }
                    public void checkServerTrusted(X509Certificate[] chain, String authTyhpe) throws CertificateException {
                    }
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                };
                ssl_ctx.init(null, new TrustManager[] { tm }, null);
            }
        } catch (KeyStoreException e) {
            Log.d("SSLClient", e.getMessage());
        } catch (NoSuchAlgorithmException e) {
            Log.d("SSLClient", e.getMessage());
        } catch (CertificateException e) {
            Log.d("SSLClient", e.getMessage());
        } catch (IOException e) {
            Log.d("SSLClient", e.getMessage());
        } catch (KeyManagementException e) {
            Log.d("SSLClient", e.getMessage());
        } catch (UnrecoverableKeyException e) {
            Log.d("SSLClient", e.getMessage());
        }
    }
}

package com.example.mark.sslclient;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private SSLClient sslClient;

    private Runnable threadMain = new Runnable() {
        @Override        public void run() {
            SSLSocketFactory socketFactory = (SSLSocketFactory)sslClient.ssl_ctx.getSocketFactory();
            try {
                Log.d(TAG, "threadMain createSocket a");
                SSLSocket socket = (SSLSocket)socketFactory.createSocket("192.168.1.61", 8080);
                Log.d(TAG, "threadMain createSocket b");
                PrintWriter output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                BufferedReader input = new BufferedReader((new InputStreamReader(socket.getInputStream())));
                output.println("\nthis is from client+++++++++++++++client send to server");
                output.flush();
                Log.d(TAG, "threadMain input.readLine() a");
                String line = input.readLine();
                while (line != null) {
                    Log.d(TAG, line);
                    line = input.readLine();
                }
                Log.d(TAG, "threadMain input.readLine() b");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate a");
        setContentView(R.layout.activity_main);

        sslClient = new SSLClient(this);
        Thread thread = new Thread(threadMain);
        thread.start();
        Log.d(TAG, "onCreate b");
    }
}

2017年9月4日 星期一

Huawei 在 Android Studio 沒有 logcat

撥打 *#*#2846579#*#*
Project Menu > Background Setting > Log setting
選擇 AP Log

Android 與 Raspberry 證書

請參考先前的 Raspberry OPENSSL 根證書 伺服端 客戶端
和 Java keytool and Android

// 產生 Android 要用的 key 和 keystore
D:\SVN_Repository3\pi\Key>"C:\Program Files\Java\jdk1.7.0_67\bin\keytool.exe" -validity 3650 -genkey -v -alias android -keyalg RSA -keystore android.jks -dname "CN=AndroidClient,OU=R&D,O=SDL,L=Taichung,ST=Taiwan,c=TW" -storepass store1234 -keypass key1234
針對 CN=AndroidClient, OU=R&D, O=SDL, L=Taichung, ST=Taiwan, C=TW 產生有效期 3,650 天的 2,048 位元 RSA 金鑰組以及自我簽署憑證 (SHA256withRSA)

[儲存 android.jks]

D:\SVN_Repository3\pi\Key>
// 產生申請證書
D:\SVN_Repository3\pi\Key>"C:\Program Files\Java\jdk1.7.0_67\bin\keytool.exe" -certreq -keystore android.jks -alias android -file android.csr -storepass store1234 -keypass key1234

D:\SVN_Repository3\pi\Key>dir
 磁碟區 D 中的磁碟是 新增磁碟區
 磁碟區序號:  3AAA-91FF

 D:\SVN_Repository3\pi\Key 的目錄

2017/09/04  11:15    <DIR>          .
2017/09/04  11:15    <DIR>          ..
2017/09/04  11:15             1,086 android.csr
2017/09/04  11:14             2,231 android.jks
               2 個檔案           3,317 位元組
               2 個目錄  678,150,483,968 位元組可用

D:\SVN_Repository3\pi\Key>

// 傳送 android.csr 到 RaspberryPi, 並簽署
pi@raspberrypi:~/OpenSSL/openssl $ openssl ca -in android/android.csr -out android/android.crt -days 3650 -cert ca/ca.crt -keyfile ca/ca.key -config openssl.cnf

Using configuration from openssl.cnf
Check that the request matches the signature
Signature ok
The stateOrProvinceName field needed to be the same in the
CA certificate (Taiwan) and the request (Taiwan)
pi@raspberrypi:~/OpenSSL/openssl $
// 原因為編碼錯誤, 下兩個命令可以查詢, 並比較
pi@raspberrypi:~/OpenSSL/openssl $ openssl asn1parse -in androiid/android.csr
pi@raspberrypi:~/OpenSSL/openssl $ openssl asn1parse -in ca/ca.crt
// 修改設定
pi@raspberrypi:~/OpenSSL/openssl $ vi openssl.cnf
#string_mask = utf8only
string_mask = pkix
# For the CA policy
[ policy_match ]
#countryName            = match
#stateOrProvinceName    = match
#organizationName       = match
countryName             = optional
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

pi@raspberrypi:~/OpenSSL/openssl $ openssl ca -in android/android.csr -out android/android.crt -days 3650 -cert ca/ca.crt -keyfile ca/ca.key -config openssl.cnf
Using configuration from openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4 (0x4)
        Validity
            Not Before: Sep  4 05:46:35 2017 GMT
            Not After : Sep  2 05:46:35 2027 GMT
        Subject:
            countryName               = TW
            stateOrProvinceName       = Taiwan
            organizationName          = SDL
            organizationalUnitName    = R&D
            commonName                = AndroidClient
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                99:6F:21:B8:C1:2A:DB:03:7F:37:47:17:F5:C8:6C:10:18:B2:75:50
            X509v3 Authority Key Identifier:
                keyid:F4:6D:3E:3D:93:2A:4A:81:85:62:C3:D7:4B:70:F9:28:F6:E6:A4:F4

Certificate is to be certified until Sep  2 05:46:35 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
// 不明原因失敗,下列為解決方法
pi@raspberrypi:~/OpenSSL/openssl $ ls newcerts/
01.pem  02.pem  03.pem
pi@raspberrypi:~/OpenSSL/openssl $ openssl ca -revoke newcerts/03.pem -config op
enssl.cnf -cert ca/ca.crt -keyfile ca/ca.key
Using configuration from openssl.cnf
Revoking Certificate 03.
Data Base Updated
pi@raspberrypi:~/OpenSSL/openssl $
// 重新簽署
pi@raspberrypi:~/OpenSSL/openssl $ openssl ca -in android/android.csr -out android/android.crt -days 3650 -cert ca/ca.crt -keyfile ca/ca.key -config openssl.cnf
Using configuration from openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4 (0x4)
        Validity
            Not Before: Sep  4 05:51:48 2017 GMT
            Not After : Sep  2 05:51:48 2027 GMT
        Subject:
            countryName               = TW
            stateOrProvinceName       = Taiwan
            organizationName          = SDL
            organizationalUnitName    = R&D
            commonName                = AndroidClient
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                99:6F:21:B8:C1:2A:DB:03:7F:37:47:17:F5:C8:6C:10:18:B2:75:50
            X509v3 Authority Key Identifier:
                keyid:F4:6D:3E:3D:93:2A:4A:81:85:62:C3:D7:4B:70:F9:28:F6:E6:A4:F4

Certificate is to be certified until Sep  2 05:51:48 2027 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
pi@raspberrypi:~/OpenSSL/openssl $

//將 ca.crt 和 android.crt 傳回 PC
// 安裝根證書
D:\SVN_Repository3\pi\Key>"C:\Program Files\Java\jdk1.7.0_67\bin\keytool.exe" -import -trustcacerts -v -alias ca -file ca.crt -keystore android.jks -storepass store1234
擁有者: CN=PiCA, OU=R&D, O=SDL, L=Taichung, ST=Taiwan, C=TW
發出者: CN=PiCA, OU=R&D, O=SDL, L=Taichung, ST=Taiwan, C=TW
序號: e595993377a61f60
有效期自: Tue Aug 29 09:40:37 CST 2017 到: Fri Aug 27 09:40:37 CST 2027
憑證指紋:
         MD5:  8D:94:79:EB:E6:81:8C:33:4F:BE:7C:EF:16:D3:23:28
         SHA1: 7B:DF:78:14:87:F1:C8:DA:27:91:9B:6C:B7:7C:B6:6C:3F:84:59:13
         SHA256: 38:C6:7B:DC:DB:28:EA:CC:6A:A0:38:4B:DF:D2:D6:B2:44:70:CE:B5:86:F0:DE:9B:99:49:3C:75:D6:5C:89:EB
         簽章演算法名稱: SHA256withRSA
         版本: 3

擴充套件:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: F4 6D 3E 3D 93 2A 4A 81   85 62 C3 D7 4B 70 F9 28  .m>=.*J..b..Kp.(
0010: F6 E6 A4 F4                                        ....
]
]

#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: F4 6D 3E 3D 93 2A 4A 81   85 62 C3 D7 4B 70 F9 28  .m>=.*J..b..Kp.(
0010: F6 E6 A4 F4                                        ....
]
]

信任這個憑證? [否]:  y
憑證已新增至金鑰儲存庫中
[儲存 android.jks]

D:\SVN_Repository3\pi\Key>
// 安裝證書
D:\SVN_Repository3\pi\Key>"C:\Program Files\Java\jdk1.7.0_67\bin\keytool.exe" -import -v -alias android -file android.crt -keystore android.jks -storepass store1234 -keypass key1234
憑證回覆已安裝在金鑰儲存庫中
[儲存 android.jks]

D:\SVN_Repository3\pi\Key>
// 產生 BKS 格式的 keystore
D:\SVN_Repository3\pi\Key>"C:\Program Files\Java\jdk1.7.0_67\bin\keytool.exe" -importkeystore -srckeystore android.jks -srcstorepass store1234 -destkeystore android.bks -deststoretype BKS -deststorepass store1234 -provider org.bouncycastle.jce.provider.BouncyCastleProvider
已成功匯入別名 ca 的項目。
輸入 <android> 的金鑰密碼
已成功匯入別名 android 的項目。
已完成匯入命令: 成功匯入 2 個項目,0 個項目失敗或已取消

D:\SVN_Repository3\pi\Key>dir
 磁碟區 D 中的磁碟是 新增磁碟區
 磁碟區序號:  3AAA-91FF

 D:\SVN_Repository3\pi\Key 的目錄

2017/09/04  14:39    <DIR>          .
2017/09/04  14:39    <DIR>          ..
2017/09/04  14:39             4,155 android.bks
2017/09/04  13:51             4,417 android.crt
2017/09/04  13:42             1,086 android.csr
2017/09/04  13:52             4,150 android.jks
2017/08/29  09:40             1,289 ca.crt
               5 個檔案          15,097 位元組
               2 個目錄  678,150,561,792 位元組可用

D:\SVN_Repository3\pi\Key>