製作モジュール一覧

ラベル #00 覚書 の投稿を表示しています。 すべての投稿を表示
ラベル #00 覚書 の投稿を表示しています。 すべての投稿を表示

2023年2月20日月曜日

Docker覚書

Dockerのメモです。徐々に追加します。

Dockerのインストール


Windows、MacOS、Linuxに対応しているが、Windowsの場合はWindows 11 Proがおすすめ。HomeバージョンはWSLをインストールする必要があるなど手間がかかる。

Windowsの場合はDocker Desktopをインストールする。

Dockerのチュートリアル


「さくらのナレッジ」の「Docker入門」https://knowledge.sakura.ad.jp/13265/

Linuxへのインストールから始まるが、Windowsの場合はDocker Desktopをインストール。
インストール後はDocker Desktopは使わずにPower Shellでコマンド実行。

第六回で使うdocker-composeもDocker Desktopをインストールすれば使える。

第一回および第六回のWordpressは記載の手順ではブラウザからアクセスするとエラーが発生する。


Dockerオフィシャルの「クイックスタート Wordpress」の手順で正常動作する。


※MySQLにrootでログインできないのが原因?

正常動作するdocker-compose.yml (Dockerオフィシャルの「クイックスタート Wordpress」より)

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

Dockerコマンド


イメージを取得
> docker pull <イメージ名>:<タグ>

イメージ一覧
> docker images

コンテナをバックグランドで起動
> docker run -d --name <コンテナ名> -p <ホスト側のポート>:<コンテナのポート> <イメージ名>:<タグ>

コンテナ一覧
> docker ps -a

コンテナにログイン
> docker exec -it <コンテナ名> bash

ファイルコピー(ホスト→コンテナ内)
> docker cp <ホスト側のファイル> <コンテナ名>:<コンテナ内のコピー先ディレクトリ>

ファイルコピー(コンテナ内→ホスト)
> docker cp <コンテナ名>:<コンテナ内のコピー元ファイル> <ホスト側のコピー先ディレクトリ>

コンテナからDockerイメージ作成
> docker commit <コンテナ名> <作成するDockerイメージ名>

コンテナ停止
> docker stop <コンテナ名>

コンテナ削除
> docker rm <コンテナ名>

コンテナ一括削除
> docker rm $(docker ps -a -q)

イメージ削除
> docker rmi <コンテナ名>

イメージ一括削除
> docker rmi $(docker images -q)

Dockerfileのビルド
> cd <Dockerfileのあるディレクトリ> 
> docker build -t <イメージ名> .
※最後の「.」はカレントディレクトリ

ネットワーク作成
> docker network create <ネットワーク名>

ネットワーク一覧
> docker network ls

ネットワーク詳細
> docker network inspect <ネットワーク名>

ネットワーク削除
> docker network rm <ネットワーク名>

Docker Composeコマンド


コンテナを起動
> cd <docker-compose.ymlのあるディレクトリ>
> docker-compose up -d

コンテナ一覧
> docker-compose ps

コンテナ停止
> docker-compose stop

コンテナ削除
> docker-compose rm

停止、削除、ネットワーク削除
> docker-compose down

停止、削除、ネットワーク削除、イメージ削除
> docker-compose down --rmi all

 

Docker Composeを使ってLAMP環境を作る



docker-lamp/
├── docker-compose.yml
├── htdocs/
└── php/
    ├── Dockerfile
    └── php.ini
※php.iniは空のファイルを作っておく

docker-compose.yml


version: '3.7'

services:
  mysql:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'password'

  phpmyadmin:
    depends_on:
      - mysql
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql
    restart: always
    ports:
      - "8080:80"

  php-apache:
    build: ./php
    volumes:
      - ./htdocs:/var/www/html
    restart: always
    ports:
      - "80:80"
    depends_on:
      - mysql

volumes:
    db_data: {}

php/Dockerfile


FROM php:7.3-apache
COPY ./php.ini /usr/local/etc/php/
RUN apt-get update \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv

コンテナ起動

> cd docker-lamp
> docker-compose build
> docker images
> docker-compose up -d

Apacheの確認


htdocs/index.html


<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <p>Hello World!!</p>
  </body>
</html>

ブラウザで確認

http://localhost/

PHPの確認


htdocs/info.php

<?php
phpinfo();
?>

ブラウザで確認 

http://localhost/info.php

MySQLの確認


> docker exec -it docker-lamp_mysql_1 bash

# mysql -u root -p

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.27    |
+-----------+
1 row in set (0.00 sec)

phpMyAdminの確認

ブラウザで確認

http://localhost:8080


コンテナ停止・終了


$ docker-compose stop
$ docker-compose down

データベースも含めて削除
$ docker-compose down --volumes

2023年2月16日木曜日

Ubuntu Server 20.04 LTS覚書 LAMPインスール

インストールするPC


Windows11がインストールできない古いノートPCにLinuxをインストールしました。


もとはWindows7が入っていた機種です。Windows10はインストールできたのでそのまま使っていました。

HWiNFO64によるシステム概要

CPU: Intel Core i5-2410M
Memory: DDR3 4GB
SSD: 480GB

Ubuntu Server 20.04 LTSのインストール


最新版のLTSは22.10ですが、情報が多い20.04をインストールします。

Ubuntu Server 20.04 LTSを入手


Alternative Downloads
Get Ubuntu Server 20.04 LTS

UbuntuのUSBインストールメディアを作成

WidnowsではRufusを使ってUSBメモリにインストーラーを書き込む

Ubuntuのインストール
PC(BIOS/UEFI)のBOOTセレクタでUSBドライブを選択して起動

  • Langage→English
  • Installer update→Continue without updating
  • Keyboard→English(US) Valiant→English(US)
  • Network→有線LANがつながっていることを確認
  • Proxy→(空欄のまま)Done
  • Mirror address→デフォルト(http://jp.archive.ubuntu.com/ubuntu)→Done
  • Guided storage configuration→(X) Use an entire disk [X] Setup up this disk as na LVM group→Done
  • Storage configuration→Done
  • Confirm destructive action→Continue ※ディスクは初期化される
  • Profile→適宜入力→Done
  • SSH Setup→Install OpenSSH Server→Done
  • Featured Saver Snaps→何も選択しない→Done


Open SSH serverのインストール


Open SSHがインストールされていない場合はaptでinstallする。
$ sudo apt update
$ sudo apt install openssh-server

OpenSSH Serverが起動していることを確認
$ systemctl status ssh

起動していない場合
$ sudo systemctl enable ssh
$ sudo systemctl start ssh

以上で、パスワード認証でSSH接続可能になる。

諸設定・確認


ノートPCの蓋を閉じたときにスリープしなくする。


logind.confを編集
$ sudo nano /etc/systemd/logind.conf
一行追加
HandleLidSwitch=ignore
サービスを再起動
$ sudo systemctl restart systemd-logind.service

現在起動しているサービスの一覧を表示 ([--all]で全サービス)

$ systemctl -t service

サービスの起動設定の一覧を表示

$ systemctl list-unit-files -t service

ubuntuバージョン確認

$ cat /etc/issue

$ cat /etc/os-release (詳細)


IPアドレス確認

$ hostname -I
$ ip a

ifconfigはnet-toolsをインストールすると利用できる
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install net-tools

IPアドレス、ポート確認

$ netstat -atuw
-a 待ち受け(LISTEN)ポートも表示
-t TCP
-u UDP
-w ICP・RAW

ディスク使用量確認

$ df -h --total

物理ディスクを確認

$ sudo fdisk -l

aptコマンド


※aptとapt-getがあるがaptを使う

パッケージ一覧を更新

$ sudo apt update

パッケージを更新

$ sudo apt upgrade

パッケージをインストール

$ sudo apt install <パッケージ名>

パッケージをアンインストール

$ sudo apt remove <パッケージ名>

パッケージを完全削除(設定ファイルを含む)

$ sudo apt purge <パッケージ名> 

$ sudo apt remove --purge <パッケージ名>

不要なパッケージをまとめてアンイストール

$ sudo apt autoremove

ファイル名からパッケージを探す(部分一致)

$ apt search <パッケージ名>
$dpkg -l | grep <パッケージ名>

 

パッケージの詳細情報を表示

$ apt show <パッケージ名>


ファイアーウォールの設定


学習のためファイアーウォールが無効化されているのを確認
$ sudo ufw status
Status: inactive

LAMPのインストール


taskselをインストール

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install tasksel

taskselでLAMPをインストール

$ sudo tasksel

taskselをオプション無しで起動→メニュー画面
LAMP serverを選択しインストール


※Ubuntuの非Server版はtaskselのメニュー項目が異なるようです

Apache2の確認


$ apache2 -v
Server version: Apache/2.4.41 (Ubuntu)
Server built:   2023-01-23T18:36:09
$ service apache2 status
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-02-15 11:39:13 UTC; 24h ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 30837 (apache2)
      Tasks: 11 (limit: 4494)
     Memory: 59.4M
     CGroup: /system.slice/apache2.service
             ├─30837 /usr/sbin/apache2 -k start
             ├─30839 /usr/sbin/apache2 -k start
             ├─30840 /usr/sbin/apache2 -k start
             ├─30841 /usr/sbin/apache2 -k start
             ├─30842 /usr/sbin/apache2 -k start
             ├─30845 /usr/sbin/apache2 -k start
             ├─30846 /usr/sbin/apache2 -k start
             ├─30847 /usr/sbin/apache2 -k start
             ├─30851 /usr/sbin/apache2 -k start
             ├─30852 /usr/sbin/apache2 -k start
             └─30875 /usr/sbin/apache2 -k start

Feb 15 11:39:13 dynabook systemd[1]: Starting The Apache HTTP Server...
Feb 15 11:39:13 dynabook apachectl[30835]: [Wed Feb 15 11:39:13.223689 2023] [alias:warn] [pid 30835] AH00671: The Alias direc>
Feb 15 11:39:13 dynabook apachectl[30835]: AH00558: apache2: Could not reliably determine the server's fully qualified domain >
Feb 15 11:39:13 dynabook systemd[1]: Started The Apache HTTP Server.

IPアドレス確認

$ hostname -I

ブラウザから確認

http://<IPアドレス>:80

PHPの確認


$ php -v
PHP 7.4.3-4ubuntu2.17 (cli) (built: Jan 10 2023 15:37:44) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3-4ubuntu2.17, Copyright (c), by Zend Technologies

htmlディレクトリのパーミッションを変更

$ sudo usermod -a -G www-data <user name>
$ sudo chown -R -f www-data:www-data /var/www/html
$ sudo chmod -R g+w /var/www/html

logoutしてloginしなおす

テスト用のPHPファイルを作成

$ nano /var/www/html/example.php

 ファイルを編集

<?php
phpinfo();
?>

テスト用PHPの動作確認


http://<IPアドレス>/example.php


MySQLの確認


$ mysql --version
mysql  Ver 8.0.32-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))

MySQLのセキュリティ設定


mysql_secure_installation実行中にエラーが発生するので先にrootパスワードを設定してもく
$ sudo mysql -u root -p

パスワードなしでEnter

SQLでrootパスワードを設定
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '<password>';
flush privileges;
quit

mysql_secure_instllaionを実行
$ sudo mysql_secure_installation
Securing the MySQL server deployment.

Enter password for user root: 

SQLで設定した<password>を入力

VALIDATE PASSWORD COMPONENT→No
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: n

パスワード変更→No
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n

VALIDATE PASSWORD COMPONENT→No
あとはすべてYes
 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 

MySQLで使うUser(root権限)を追加

$ sudo mysql -u root -p
Enter password:
設定したrootパスワードを入力
CREATE DATABASE exampledb;
CREATE USER '<username>'@'localhost' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON *.* TO '<username>'@'localhost';
FLUSH PRIVILEGES;
quit

phpMyAdminのインストール


php-mysqlがインストールされていることを確認

$ apt list php-mysql

パッケージのアップデート

$ sudo apt update
$ sudo apt upgrade

PHPMyAdminのインストール

$ sudo apt install phpmyadmin
webサーバ→apache2を選択
dbconfig-commonで設定→Yes
phpmyadmin 用の MySQL アプリケーションパスワード:→パスワードを入力

Apacheの設定

$ sudo nano /etc/apache2/apache2.conf
最下行に次の一行を追加
Include /etc/phpmyadmin/apache.conf
Apacheを再起動
$ sudo service apache2 restart

PHPMyAdminにアクセス

http://<IPアドレス>/phpmyadmin


設定したuser、passwordでログイン


メモ


VNC


「Ubuntu Desktop (22.04/20.04) にVNCサーバ(TightVNC)をインストールする!」https://lab4ict.com/system/archives/5689

2022年12月3日土曜日

Raspberry Pi 覚書

Raspberry Piを使っていく上でのメモです。徐々に追加する予定です。

使用環境
  • Raspberry Pi 3 Model B V1.2
  • HDMIモニタ
  • USBキーボード(無線)
  • USBマウス(無線)


Raspberry Piを背面にマウントできるタイプのHDMIモニタを使用しています。

キーボードとマウスは中華製の安物ですが、USBドングル一つで無線接続できるのでUSBポートの節約になります。

ネットワークにWifiを使えば、必要なケーブルは電源用のUSBケーブル1本のみとなります。

Raspberry Pi 初期設定


OSインストール


Raspberry Pi Imagerを入手

SDカードを読み書きできるPCにRaspberry Pi Imagerをインストール。

Raspberry Pi Imagerを起動。
  • OS: Raspberry Pi OS (32-bit)
  • ストレージ: SDドライブを選択
  • 書き込む

Raspberry PiのSDカードドライブにOSを書き込んだSDカードを挿入して起動。

SSHの設定


「スタート」→「設定」→「Raspberry Piの設定」
「インターフェイス」→「SSH」: ON →「OK」


VNCの設定


VNCを使うとGUIでリモート操作が可能になる。

PCのVNC ViewerでRaspberry Piに接続しているようす

「スタート」→「設定」→「Raspberry Piの設定」
「インターフェイス」→「VNC」: ON →「OK」

VNC ViewerでPCから接続。

参考
Interface 2021年9月号 104p  「特設2 第2章 ラズベリー・パイ4/3B/3B+のセットアップ」

LAMPのインストール


以下の順にインストールします。
  • Apache2
  • PHP7
  • MySQL(MariaDB)
  • phpMyAdmin

Raspberry Pi OSのバージョン 

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.15.76-v7+ #1597 SMP Fri Nov 4 12:13:17 GMT 2022 armv7l GNU/Linux

Apache2のインストール


パッケージのアップデート
sudo apt update
sudo apt upgrade

Apache2のインストール
sudo apt install apache2

Apache2が起動しているか確認
ps agx | grep apache

WebブラウザでApache2に接続。
http://127.0.0.1/

ユーザーpiがhtmlを編集できるようにwww-dataグループを作り所有権を変更。
sudo usermod -a -G www-data pi
sudo chown -R -f www-data:www-data /var/www/html
sudo chmod -R g+w /var/www/html

ログアウトしてログインし直す。

デフォルトWebページを編集
nano /var/www/html/index.html

PHP7のインストール

PHP7のインストール
sudo apt install php7.4 libapache2-mod-php7.4 php7.4-mbstring php7.4-mysql php7.4-curl php7.4-gd php7.4-zip

テスト用のPHPファイルを作成
nano /var/www/html/example.php

nanoでテキストを編集
<?php
phpinfo();
?>

動作確認
http://localhost/example.php

MySQLのインストール


参考「Pi My Life Up:  Setup a Raspberry Pi MYSQL 」

パッケージのアップデート
sudo apt update
sudo apt upgrade

MySQLのインストール
sudo apt install mariadb-server

MySQLのセキュリティ設定
sudo mysql_secure_installation
すべて「Y」を選択する。

mysql_secure_installationで表示されるメッセージ (DeepLで和訳)

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

注:このスクリプトのすべての部分を実行することは、すべてのMariaDBサーバーに推奨されます。
      サーバで使用することを推奨します。 各ステップを注意深く読んでください!

In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and haven't set the root password yet, you should just press enter here.

MariaDBにログインしてセキュリティを確保するためには、rootユーザーの現在のパスワードが必要です。MariaDBをインストールしたばかりで、まだrootパスワードを設定していない場合は、ここでEnterキーを押すだけでよいでしょう。

Enter current password for root (enter for none): 

OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

rootのパスワードを設定するか、unix_socketを使用することで、誰も適切な権限なしにMariaDBのrootユーザーにログインすることができないようにすることができます。

あなたは既にrootアカウントを保護しているので、安全に'n'と答えることができます。

Switch to unix_socket authentication [Y/n] Y
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

すでにrootアカウントは保護されていますので、安心して「n」とお答えください。

Change the root password? [Y/n] Y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them.  This is intended only for testing, and to make the installation go a bit smoother.  You should remove them before moving into a production environment.

デフォルトでは、MariaDBのインストールには匿名ユーザーがあり、誰でもユーザーアカウントを作成することなくMariaDBにログインすることができるようになっています。 これはテスト用で、インストールを少しスムーズにするためだけです。 本番環境に移行する前に削除しておく必要があります。

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This ensures that someone cannot guess at the root password from the network.

通常、rootは「localhost」からの接続のみを許可されるべきです。 これにより、誰かがネットワークからrootのパスワードを推測することができないようにします。

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can access.  This is also intended only for testing, and should be removed before moving into a production environment.

デフォルトでは、MariaDBには誰でもアクセスできる'test'という名前のデータベースが付属しています。 これもテスト用であり、本番環境に移行する前に削除してください。

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far will take effect immediately.

権限テーブルを再ロードすることで、これまでに行ったすべての変更が直ちに有効になります。

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB installation should now be secure.

Thanks for using MariaDB!

すべて完了  上記の手順がすべて完了したら、MariaDBのインストールは安全なものになるはずです。

MariaDBを使用していただきありがとうございます。

MySQLサーバーへのアクセス
sudo mysql -u root -p

SQLのテスト
CREATE DATABASE exampledb;
CREATE USER 'pi'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON exampledb.* TO 'pi'@'localhost';
FLUSH PRIVILEGES;
quit;

PHP MySQLコネクタのインストール
sudo apt install php-mysql

phpMyAdminのインストール



パッケージのアップデート
sudo apt update
sudo apt upgrade

PHPMyAdminのインストール
sudo apt install phpmyadmin
webサーバ→apache2を選択
dbconfig-commonで設定しますか?→はい
phpmyadmin 用の MySQL アプリケーションパスワード:→パスワードを入力

rootはPHPMyAdminで禁止されているのでユーザーを作成しすべてのアクセスを許可する。
sudo mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'pi'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
quit;

Apacheの設定
sudo nano /etc/apache2/apache2.conf

最下行に次の一行を追加
Include /etc/phpmyadmin/apache.conf

Apacheを再起動
sudo service apache2 restart

PHPMyAdminにアクセス
http://127.0.0.1/phpmyadmin

IPアドレスは次のコマンドで確認
hostname -I

Raspberry PiでphpMyAdminを実行しているようす

phpMyAdminのドキュメント

2022年8月25日木曜日

FV01 マルチエフェクタの製作 その3 EEPROMのプログラミングにRaspberry Pi Picoを利用

FV-1はEEPROMに書き込んだ外部プログラムを利用できます。プログラム開発はSpinAsm IDEで行います。FV-1の公式ページの一番下あたりに「software :: SpinAsm assembler for the SPN1001V1.1.31 (Windows executable)」というリンクがあり、ダウンロードできます。

SpinAsm IDEから出力されるのはHEXファイル(Intel HEX形式)です。SPN1001-DEVBという開発ボードを使えばSpinAsm IDEから直接EEPROMに書き込み可能でスマートに開発できるようです。

あまりスマートではないですが、HEXファイルをバイナリに変換しEEPROMに書き込めば良いので、安価なマイコンボードであるRapsberry Pi Picoを利用することにしました。

ブロック図

太い線で囲ったところがRaspberry Pi picoを使って製作したPico Rom Writerです。

WindowsのターミナルソフトにはTeraTermがよく使われていますが、私は機能が豊富なRLoginを使用しています。今回もRLoginのファイル送信機能に頼っています。

ハードウェアPicoRomWriterの製作



回路図

I2CのSCLとSDAはFV-1で内部プルアップされ、Raspberry Pi picoでも内部プルアップされています。さらにPico Rom Writerでもピンソケットを使ってプルアップ可能としています。外部プルアップは信号線の波形を見て決めます。並列にプルアップされることになるのでプルアップする場合は抵抗値を大きめにします。

Raspberry Pi Picoはリセットボタンがないので、RESET(RUN)ボタンを外付けしています。

Raspberry Pi PicoでMicro Pythonを実行する準備


MicroPythonファームウェア(UF2ファイル)をダウンロードしておきます。


以下の手順でUF2ファイルをPicoに書き込みます。

  • PicoをBOOTSELボタンを押しながらパソコンにUSBケーブルで繋げる。
  • ストレージとして認識され、エクスプローラーが開く。
  • UF2ファイルをPicoのドライブにコピー。

EEPROMライティングプログラム SpinRomWriter


USBシリアル通信でパソコンから.hexファイルを受信し、バイナリに変換した後、I2C経由でFV01の外付けEEPROMに書き込むMicroPythonのプログラムです。

SpinRomWriter.py
#
# SpinRomWriter.py
#
# SpinAsmが出力したHEXファイルを24LC32A(EEPROM)に書き込む
#
# Target: Raspberry Pi pico / micropython
#
# 2022.08.20
#
import time
import sys
from machine import Pin, I2C

TITLE_STR = 'SpinRomWriter 20220820'

N_BYTES = 4         # 一度に読み書きするバイト数
DATA_LEN = 4096     # 32KBits
MAX_LINES = 1026    # シリアルで読み込む最大行数

PIN_LED = Pin(25, Pin.OUT)

# HEX文字列をバイナリに変換
def hex2bin(hexstr):
    if hexstr[0] != ':':
        print('Invalid header character')
        return -1
    hexstr = hexstr[1:]
    data = []
    for i in range(0, len(hexstr), 2):
        s = hexstr[i : i + 2]
        data.append(int(s, 16))
    return data
    
# チェックサム
def checksum(data):
    sum = 0
    for n in data:
        sum += n
    sum &= 0xff
    return sum

# シリアルからHEXファイルを受信
def receiveData():
    bArr = bytearray(DATA_LEN)
    for i in range(MAX_LINES):
        if i % 32 == 0:
            PIN_LED.value(not PIN_LED.value())
        hexStr = input()
        data = hex2bin(hexStr)
        if (data == -1):
            print('line:', i + 1, ': data is invalid')
            return -1
        # チェックサム
        if (checksum(data) != 0):
            print('line:', i + 1, ': checkusm is invalid')
            return -1
        # データエンドを検出
        if (data[3] == 1):
            return bArr;
        # データをbytearrayに格納
        n = data[0]
        addr = (data[1] << 8) | data[2]
        for i in range(n):
            bArr[addr + i] = data[4 + i]
    else:
        print('No data end detected.')
        return -1

# EEPROMに書き込み
def writeEEPROM(bArr, dataLen, nBytes):
    for memaddr in range(0, dataLen, nBytes):
        if memaddr % 32 == 0:
            PIN_LED.value(not PIN_LED.value())
        ba = bArr[memaddr:memaddr+nBytes]
        i2c.writeto_mem(0x50, memaddr, ba, addrsize=16)
        time.sleep_ms(5)

# EEPROMから読み込み
def readEEPROM(dataLen, nBytes):
    bArr = bytearray()
    for memaddr in range(0, dataLen, nBytes):
        ba = i2c.readfrom_mem(0x50, memaddr, nBytes, addrsize=16)
        bArr.extend(ba)
    return bArr

# EEPROMのベリファイ
def verifyEEPROM(bArr1, bArr2):
    bytesOK = 0
    for memaddr in range(len(bArr1)):
        b1 = bArr1[memaddr]
        b2 = bArr2[memaddr]
        if (b1 == b2):
            bytesOK += 1
        else:
            print('%04X:%02X:%02X Data is invalid.' % (memaddr, b1, b2))
    return bytesOK
    
# データを比較して表示
def showComparison(bArr1, bArr2):
    for memaddr in range(0, DATA_LEN, N_BYTES):
        ba1 = bArr[memaddr:memaddr+N_BYTES]
        ba2 = bArr2[memaddr:memaddr+N_BYTES]
        print('ORG:%04X:' % memaddr, end='')
        for b1 in ba1:
            print('%02X:' % b1, end='')
        print('')
        print('ROM:%04X:' % memaddr, end='')
        for b2 in ba2:
            print('%02X:' % b2, end='')
        print('')

# メインルーチン
time.sleep_ms(3000)
while True:
    print(TITLE_STR)
    print('Please send a HEX file.')
    # データを受信
    bArr = receiveData()
    PIN_LED.value(0)
    if (bArr == -1):
        continue
    print('HEX file received successfully.')

    i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=100000)

    # EEPROMに書き込み
    print("Write to EEPROM.")
    writeEEPROM(bArr, DATA_LEN, N_BYTES)
    PIN_LED.value(0)

    # EEROMから読み込み
    print("Read from EEPROM.")
    bArr2 = readEEPROM(DATA_LEN, N_BYTES)

    #showComparison(bArr, bArr2)

    print("Verify data.")
    bytesOK = verifyEEPROM(bArr, bArr2)

    print('Verified:', bytesOK, 'bytes')

SpinASM IDEはソースの.spnファイルを8個まとめてIntel Hex形式の.hexファイルを出力します。Intel Hex形式(.hex)はバイナリファイルをテキスト形式にしたものです。

一例をあげるとこのような形式になります。
:04003C001333014D2C
:00000001FF
フォーマットについては割愛しますが、SpinASM IDEが出力する.hexファイルの最終行(データの終了)は「:00000001FF」です。

プログラム中で「bytearray」クラスを使用しています。通常、配列には「リスト」を用いますが、Raspberry Pi PicoのMicroPythonでは大きなサイズ(4kB以上)の配列を「リスト」では使えないためです。

EEPROMライティングプログラム SpinRomWrter.pyをpicoに書き込む


EEPROMライティングプログラムの書き込みはThonnyを使います。Thonnyをダウンロードしてインストールします。

「ツール」-「options..」-「インタプリタ」でインタープリタに「MicorPython(Raspberry Pi Pico」を指定します。

Raspberry Pi PicoをパソコンにUSBケーブルで接続します。

上記プログラムをThonnyのエディタに入力し、以下の手順でPicoに書き込みます。

  • Thonnyのツールバーの「STOP」ボタンを押す。(ThonnyがPicoに接続)
  • 「ファイル」-「Save As..」
  • 「Where to save to?」ダイアログで「Raspberry Pi Pico」を選択。
  • 「File Name」を「main.py」として保存。

ファイル名を「main.py」にするとPicoの起動時に自動実行されます。

使用手順


RLoginをダウンロードしてインストールしておきます。

SpinASM IDEで「Project Dialog」を開きます。


Projectのスロットに.spnファイルを割当て、「Build」ボタンを押すと.hexファイルが「SpinAsm_IDE\hexout」フォルダに作られます。


※Thonnyが起動している場合は、「実行」-「Disconnect」で接続を切っておきます

以下の手順でFV-1のプログラムをEEPROMに書き込みます。
  • RLoginを起動

  • PicoRomWriterをUSBケーブルで接続

  • RLoginでPicoにシリアル接続(115200bps)



  • PicoRomWriterのRESET(RUN)ボタンを押す

  • Rloginで約3秒以内に再接続
    PicoRomWriterのRESET(RUN)ボタンを押すとUSB接続が一旦切れるので約3秒以内に再接続します。

  • ターミナルに「Please send a HEX file.」と表示されるのを確認

  • RLoginの「ファイル」-「XYZModemファイル転送」-「5ファイルアップロード」

  • 「変換処理」と「送信処理」を以下のように設定。




  • SpinASMで作成した.hexファイルを開くと送信が始まり、進捗ダイアログが表示されます。また、Picoの基板上のLEDが点滅します。



  • 「Verified: 4096bytes」と表示され、再び「Please send a HEX file.」と表示されるのを確認します。

以上でEEPROMにFV-1のプログラムが書き込まれます。

ブレッドボードを使ってEEPROMに書き込んでいる様子

EEPROMの電源はPicoRomWriterから供給できます。(3.3V)

FV01のオンボードのEEPROMに書き込んでいる様子

2022年1月1日土曜日

中華製FT232RL USB-Serial変換ボードを使ってATMega328PにArduinoのスケッチを書き込む

あらかじめ、ATMega328Pにブートローダーを書き込んでおく。


配線


XTALは16MHz。22pF。

RESETを1kΩでPullUp、0.1uFを直列に入れる。

19 PB5(D13)のLEDは動作確認用。

ATMega328P FT232RL
1 RESET 1 DTR
2 RXD 3 TX
3 TXD 2 RX
VCC 4 VCC
GND 6 GND

ArduinoIDEの操作

  1. 「ツール」-「ボード」-「Arduiono Uno」を選択。
  2. 「シリアルポート」→ USB-Serial変換ボードのCOM番号選択。
  3. 通常通りスケッチを書き込む。

Arduino ICP アダプタ


手持ちのFT232RLモジュールを使ってIn-Circuit Programingするための変換基板を製作しました。


回路図

FT232RL AVR
1 RTS 1 RESET
2 RX 3 TXD
3 TX 2 RXD
4 VCC VCC
5 CTS NC
6 GND GND

RX<->TXと互い違いに接続する必要があるため、フラットケーブルとQIコネクタで配列を変えたケーブルを作りました。ArduinoIDEからスケッチをそのまま書き込み可能です。接続したままにしておけば、Serialも使えます。

製作中のArEGと接続しているようす

2021年9月5日日曜日

STM32CubeIDE サイクル・カウンタ(CYCLECOUNTER)を使って処理速度を測定

STMicroのWebサイトで、CYCLECOUNTERレジスタを使ってマイコンの処理速度を測定する方法が紹介されています。

マイコンの演算速度を測る(その2)https://www.stmcu.jp/technical/hint/no-085/

GPIOをHigh/Lowさせて計測するよりスマートです。サイクル・カウンタとGPIO両方で処理速度を測定し、比較してみました。サイクル・カウンタの計測とGPIOの出力をオシロで観測した結果はほぼ同じ値になるはずです。

STM32CubeIDEのバージョンは1.7.0です。

MXの設定


Clock
HSE→PLL
HCLK:180MHz

Pinout & Configuration
System Core
  GPIO
    PA10
      GPIO mode: Output Push Pull
      Maximum output speed: Very High
      User Label: PIN_CHK1

ソースコード(main.cに追加)


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    HAL_GPIO_TogglePin(PIN_CHK1_GPIO_Port, PIN_CHK1_Pin);
  }
  /* USER CODE END 3 */

ConfigurationはDebugで、最適化なし(-O0)

最適化の設定方法は「STM32CubeIDE: 覚え書き」の「Buildの設定」で書きました。

サイクル・カウンタで計測


公式ページの説明は少し分かりづらかったので、注釈をつけてみました。


① Run-Debug(F11)でDebug開始


Debugを開始するとint main(void)のHAL_Init()で停止します。

② 希望の測定開始BreakPointまでコード実行(Resume,F8)


行頭をダブルクリックするとブレークポイントを切り替えられます。ブレークポイントを設定し、F8を押します。

③ Window-Show View-Memory Browserを選択し、0xE0001000番地に移動


Memory Browserのテキストボックスに「0xE0001000」と入力し「Go」をクリックします。

④ 0xE0001000のLSBビットを‘1’に変更(CYCLECOUNTERの開始)*初回のみ


Memory Browser内で右クリックしてメニューを表示→「Cell Size」で1byteを選択します。0xE0001000のセルをクリックし「01」と入力しEnter。



⑤ 希望の測定終了BreakPointまでコード実行(Resume,F8)


⑥ 0xE0001004の値を確認(= CYCLECOUNTERの値)


Memory Browser内で右クリックしてメニューを表示→「Cell Size」で2byteを選択、「Radix」でDecimal Unsignedを選択。16byte区切りで10進表示になります。



⑦ 以降の測定Pointについては、0xE0001004の値を‘0’に変えて、②⑤⑥の繰り返し(④の再設定は不要)


0xE0001004, 0xE0001005のセルに「00000」と入力し、Enter。


今回は、

HAL_GPIO_TogglePin(PIN_CHK1_GPIO_Port, PIN_CHK1_Pin);

にBreakPointを置いて実行しました。Resumeすると、Whileループ内で再び同じ行に戻ります。

私の環境では、whileループの1回目は54、2回目以降は50となりました。1回目は何か特別な処理が行われていると思います。

50cycleとすると、180MHz駆動なので、(1 / 180MHz) * 50cycle ≒ 277.7ns

オシロでD2(PA10)の出力を観測


BreakPointを外し、Run-Debug(F11)、Resume(F8)して計測しました


周期 T = 555.2nsなので、Toggle1回分は半分の277.6nsです。

CYCLECOUNTERでの計測の結果とオシロの観測結果がほぼ等しいので、CYCLECOUNTERで処理速度を測定できているようです。

2021年1月10日日曜日

STM32CubeIDE: 覚え書き

個別の記事にするほどでもない事柄のメモです。

STM32CubeIDEがインストールできない


ルートディレクトリ(D:\など)にインストーラーを置いて実行するとうまくいく場合がある。


サンプルプロジェクトの所在


<ユーザーフォルダ>\STM32Cube\Repository\STM32Cube_FW_Fx_Vx.xx.x\Projects

例えば、C:\Users\<ユーザー名>\STM32Cube\配下など。

日本語版ドキュメント

STM32/STM8 デザイン/サポート https://www.stmcu.jp/design/

書籍

Interface 2016年12月号 別冊付録「定番ARMマイコン STM32便利帳 2016」
トランジスタ技術 2020年3月号別冊付録1「STM32F Armマイコン・プログラミング・ガイドブック」

Datasheet


STM32F303K8: DS10362 STM32F303x6/x8 Datasheet
STM32F446RE: DS10693 STM32F446xC/E Datasheet
STM32F767ZI: DS11532 STM32F767xx Datasheet
STM32G431KB: DS12589 STM32G431x6 STM32G431x8 STM32G431xB Datasheet

Reference Manual


STM32F303K8: RM0316
STM32F446RE: RM0390
STM32F767ZI: RM0410
STM32G4 Series: RM0440

Nucleoボードのユーザーマニュアル


Nucleo-32:  UM1956 User Manual STM32 Nucleo-32 boards (MB1180)
Nucleo-32 STM32G4: User Manual STM32G4 Nucleo-32 board (MB1430)
Nucleo-64:  UM1724 User Manual STM32 Nucleo-64 boards (MB1136)
Nucleo-144: UM1974 User Manual STM32 Nucleo-144 boards (MB1137)

HAL / LLのユーザーマニュアル


F3: UM1786 User Manual Description of STM32F3 HAL and low-layer drivers
F4: UM1725 User Manual Description of STM32F4 HAL and low-layer drivers
G4: UM2570 User Manual Description of STM32G4 HAL and low-layer drivers 
F7: UM1905 User Manual Description of STM32F7 HAL and low-layer drivers

STM32CubeMXのユーザーマニュアル


UM1718 STM32CubeMX for STM32 configuration and initialization C code generation

STM32CubeIDEのユーザーマニュアル


UM2609 STM32CubeIDE user guide

Buildの設定


Project - Properties
C/C++ Build > Settings


MCU Serttings: fpuの設定など
MCU GCC Compiler > Optimization: 最適化レベルなど

Timer


STM32シリーズ タイマ概要 AN4013
汎用タイマ クックブック AN4776

SPIのハードウェアNSS


うまく動作しないようだが、Pullupするとうまくいくかも?

2021年1月3日日曜日

ジャック/プラグのピンアウト

あけましておめでとうございます。

いつもはんだ付けするときにテスタで測定して極性を調べていて面倒なのでメモです。

DCジャック マル信 MJ-40

モノラルミニジャック マル信 MJ-355



※ステレオのMJ-355WもTip/Sleeveの位置は同じ。

ステレオ標準ジャック マル信 MJ-189(LP)


AliExpress ロータリースイッチ