ラベル RaspberryPi の投稿を表示しています。 すべての投稿を表示
ラベル RaspberryPi の投稿を表示しています。 すべての投稿を表示

2025年1月10日金曜日

RaspberryPi5で既存のWifiの設定を書き換える方法

RaspberryPi5で既存のWifiの設定を書き換える方法

概要

wpa_supplicant.conf は使わなくなっています

環境

  • RaspberryPi5
  • Raspbian 6.6.51

/etc/NetworkManager/system-connections/preconfigured.nmconnection を編集する

既存のWifiの設定はここにあります
直接このファイルを編集すれば OK ですが念の為バックアップを取っておきましょう

またもし新しいWifi設定が間違っている場合でも既存につなぎ直したい場合には /etc/NetworkManager/system-connections/ に別ファイルとして定義してもいいようです

psk には SSID のパスフレーズを入力しますが平文でも wpa_passphrase コマンドで暗号化したパスフレーズでもどちらでも OK です

再起動

  • sudo nmcli connection reload

ラズパイ自体を再起動しても OK です
一度ネットワークが切れるので再度ログインしましょう

動作確認

  • iwgetid

で変更後のSSIDになっていることを確認しましょう

最後に

RaspberryPi Imager から Wifi の設定するのがデフォルトになりましたがその設定は preconfigured.nmconnection にありました

nmcli でも新しいWifiのアクセスポイントを設定することもできるようです

2024年10月26日土曜日

RaspberryPi5 に castsponsorskip をインストールする

RaspberryPi5 に castsponsorskip をインストールする

概要

CastSponsorSkip が MacOS 上だとなぜか動作しなかったので RaspberryPi5 上で動かしてみました

環境

  • RaspberryPi5
  • Raspbian (bookwarm aarch64)
  • docker 27.3.1
  • castsponsorskip 0.8.0
  • Chromecast with GoogleTV

docker のインストール

公式のDebian 64bit用のインストール手順をそのまま使います

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

sudo が面倒な場合は docker グループに追加します

  • sudo gpasswd -a $USER docker

コマンド補完が必要な場合は以下も実行します

cat <<EOT >> ~/.bashrc
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi
EOT

YoutubeAPI キーの取得

GCP のプロジェクトを作成し YouTube Data API v3 を有効にし認証情報から API キーを作成します 過去にも方法を紹介しているのでこの記事を参考にするのがいいかなと思います

CastSponsorSkip の起動

  • docker run --network=host --name=castsponsorskip -e CSS_YOUTUBE_API_KEY=AIzaxxxxxxx ghcr.io/gabe565/castsponsorskip

トラブルシューティング

quotaExceeded

以下のエラーが発生しました
よくわかりませんが再度 API キーを作成した直りました
キーが古すぎるとダメなのかもしれません

にも同じ現象にあっていてそのときはプロジェクト自体新しく作成したようです

2024-10-22 04:15:36 ERR YouTube search failed. device="ファミリー ルーム 2" error="googleapi: Error 403: The request cannot be completed because you have exceeded your <a href=\"/youtube/v3/getting-started#quota\">quota</a>., quotaExceeded"

ログ

正常動作時のログになります

2024-10-22 05:31:34 INF CastSponsorSkip version=v0.8.0 commit=9e65ac39
2024-10-22 05:31:34 INF Searching for devices...
2024-10-22 05:31:34 INF Connected to cast device. device="ファミリー ルーム 2"
2024-10-22 05:32:04 INF Video ID not set. Searching YouTube for video ID... device="ファミリー ルーム 2"
2024-10-22 05:32:05 INF Detected video stream. device="ファミリー ルーム 2" video_id=xxx
2024-10-22 05:32:05 INF No segments found for video. device="ファミリー ルーム 2" video_id=xxx

最後に

Android TV for Chromecast の場合には YOUTUBE_API_KEY が必要になるようです

Youtube へリクエストは Chromecast 上で動画が再生されるたびにコールされるのでクオータには注意しましょう

2024年10月25日金曜日

iSponsorBlockTV を Chromecast with GoogleTV で設定する

iSponsorBlockTV を Chromecast with GoogleTV で設定する

概要

RaspberryPi5 上で動作させます

環境

  • RaspberryPi5
  • Raspbian (bookwarm aarch64)
  • docker 27.3.1
  • iSponsorBlockTV 2.2.1
  • Chromecast with GoogleTV

設定ファイル作成

ペアリングなどもここで行います
なお Chromecast with GoogleTV に接続する場合自動で検出してくれないので一度 Chromecast with GoogleTV で Youtube アプリを開き

設定 -> テレビコードでリンク

で RaspberryPi とペアリングするためのコードを表示しておきす

  • docker run --rm -it -v $(pwd)/data:/app/data ghcr.io/dmunozv04/isponsorblocktv --setup-cli

各種設定項目は以下の通りです
123456789012 の部分は Chromecast with GoogleTV に表示されている番号を入力してください

Could not load config file
Blank config file created
Welcome to the iSponsorBlockTV cli setup wizard
Paired with 0 Device(s). Add more? (y/N) y
Enter pairing code (found in Settings - Link with TV code): 123456789012
Pairing...
Paired device: YouTube on TV
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7fff87e87190>
Unclosed connector
connections: ['[(<aiohttp.client_proto.ResponseHandler object at 0x7fff87e41b70>, 10237.691475742)]']
connector: <aiohttp.connector.TCPConnector object at 0x7fff87e86f90>
Paired with 1 Device(s). Add more? (y/N) N
API key only needed for the channel whitelist function. Add it? (y/N) N
Enter skip categories (space or comma sepparated) Options: [sponsor, selfpromo, exclusive_access, interaction, poi_highlight, intro, outro, preview, filler, music_offtopic]:
sponsor, selfpromo, exclusive_access, interaction, poi_highlight, intro, outro, preview, filler, music_offtopic
Do you want to whitelist any channels from being ad-blocked? (y/N) N
Do you want to report skipped segments to sponsorblock. Only the segment UUID will be sent? (Y/n) n
Do you want to mute native YouTube ads automatically? (y/N) y
Do you want to skip native YouTube ads automatically? (y/N) y
Do you want to enable autoplay? (Y/n) Y
Config finished

config.json というファイルができていれば OK です

ls data/
config.json

iSponsorBlockTV の起動

  • vim compose.yaml
services:
  iSponsorBlockTV:
    image: ghcr.io/dmunozv04/isponsorblocktv
    container_name: iSponsorBlockTV
    restart: unless-stopped
    volumes:
      - /home/user01/data:/app/data
  • docker compose up -d

ログ

正常に動作しているログは以下の通りです
トークンやチャネルIDはマスクしています

iSponsorBlockTV  | 2024-10-22 06:25:46,392 - iSponsorBlockTV-xxx - INFO - Starting device
iSponsorBlockTV  | Unclosed client session
iSponsorBlockTV  | client_session: <aiohttp.client.ClientSession object at 0x7fff7f9f33d0>
iSponsorBlockTV  | 2024-10-22 06:25:46,531 - iSponsorBlockTV-xxx - INFO - Refreshed auth, lounge id token AGdxxx
iSponsorBlockTV  | 2024-10-22 06:25:46,991 - iSponsorBlockTV-xxx - INFO - Connected to device YouTube on TV (YouTube on TV)
iSponsorBlockTV  | 2024-10-22 06:25:46,991 - iSponsorBlockTV-xxx - INFO - Subscribing to lounge
iSponsorBlockTV  | 2024-10-22 06:25:46,994 - iSponsorBlockTV-xxx - INFO - Subscribing to lounge id AGdxxx
iSponsorBlockTV  | 2024-10-22 06:26:17,875 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:17,878 - iSponsorBlockTV-xxx - INFO - Getting segments for next video: xxx
iSponsorBlockTV  | 2024-10-22 06:26:17,879 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:18,975 - iSponsorBlockTV-xxx - INFO - Getting segments for next video: xxx
iSponsorBlockTV  | 2024-10-22 06:26:19,749 - iSponsorBlockTV-xxx - INFO - Getting segments for next video: xxx
iSponsorBlockTV  | 2024-10-22 06:26:33,071 - iSponsorBlockTV-xxx - INFO - Ad has ended, unmuting
iSponsorBlockTV  | 2024-10-22 06:26:33,827 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:33,827 - iSponsorBlockTV-xxx - INFO - Getting segments for next video: xxx
iSponsorBlockTV  | 2024-10-22 06:26:33,828 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:39,983 - iSponsorBlockTV-xxx - INFO - Ad has ended, unmuting
iSponsorBlockTV  | 2024-10-22 06:26:40,454 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:40,455 - iSponsorBlockTV-xxx - INFO - Getting segments for next video: xxx
iSponsorBlockTV  | 2024-10-22 06:26:40,456 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:45,501 - iSponsorBlockTV-xxx - INFO - Ad can be skipped, skipping
iSponsorBlockTV  | 2024-10-22 06:26:46,049 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:46,797 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:46,798 - iSponsorBlockTV-xxx - INFO - Getting segments for next video: xxx
iSponsorBlockTV  | 2024-10-22 06:26:46,799 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:51,823 - iSponsorBlockTV-xxx - INFO - Ad can be skipped, skipping
iSponsorBlockTV  | 2024-10-22 06:26:52,169 - iSponsorBlockTV-xxx - INFO - Ad has started, muting
iSponsorBlockTV  | 2024-10-22 06:26:55,607 - iSponsorBlockTV-xxx - INFO - Playing video xxx with 0 segments

自動でミュートしたり解除したりしてくれます

最後に

castsponsorskip よりこちらのほうが優秀なのではという気がします

参考サイト

2024年3月4日月曜日

RaspberryPi5 セットアップメモ (無線キーボード)

RaspberryPi5 セットアップメモ (無線キーボード)

概要

有線キーボードがない状態で RaspberryPi5 のセットアップをしてみました

環境

  • Raspbian
  • macOS 11.7.10
  • RaspberryPi Imager 1.8.5

道具

  • RaspberryPI5 8GBRAM
  • micro HDMI ケーブル
  • micro SD カード (32GB)
  • 無線マウス (ドングル付き
  • 無線キーボード
  • 5V3Aアダプタ (本当は5V5Aが理想です

接続

各種ケーブルやマウスなどを接続します

イメージを書き込む際の注意事項

RaspberryPi Imager で OS イメージを書き込む際に必ず SSH を有効にしましょう
また Wifi も起動時に接続するようにしましょう

こうすることで有線キーボードがなくても一旦 SSH で別のマシンからログインすることで無線を設定しその後デスクトップで作業できるようになります

と思ったのですがデスクトップ版の場合初回起動でいきなりログインした状態で起動するのでマウスさえ動けばあとは画面上部のツールバーにある Bluetooth アイコンからキーボードの接続ができるので SSH は不要です

無線キーボードを接続する

Bluetooth で接続します
ドングルはなく直接 RaspberryPi5 と接続します
デスクトップであればツールバーから設定しましょう
キーボードはペアリング状態にしましょう

SSH ではログイン後 bluetoothctl コマンドを使って接続します

capslock -> ctrl

xkb_symbols "basic" のセクションの一番下に以下を追記します
/etc/default/keyboard ではないので注意です

  • sudo vi /usr/share/X11/xkb/symbols/us
key <CAPS> { [ Control_L ] };
modifier_map Control { <CAPS> };

piapps

  • wget -qO- https://raw.githubusercontent.com/Botspot/pi-apps/master/install | bash

Minecraft などは pi-apps 経由のほうが簡単にインストールできます
「Minecraft Java Edition GDLauncher」というのをインストールしましょう

最後に

デスクトップ版の場合はキーボードマッピングを設定するファイルが少し面倒なので注意しましょう

2022年7月21日木曜日

RaspberryPi4 に Ubuntu20.04 をインストールする

RaspberryPi4 に Ubuntu20.04 をインストールする

概要

過去に RaspberryPiOS をインストールする方法を紹介しました

今回は Ubuntu 20.04 をインストールする方法を紹介します

環境

  • macOS 11.6.7
  • Raspberry Pi Imager 1.7.2
  • Ubuntu 20.04 32bit

Imager のインストール

ここを参考にインストールします

最初に削除する

SD カードが不整合を起こしている可能性があるのでまずはフォーマットします

ここでポイントですがフォーマットする際はかならず FAT32 でフォーマットします
Mac のディスクユーティリティでフォーマットすると MacOS ジャーナリングでフォーマットされてしまいうまく RaspberryPi4 が OS を認識できないので注意しましょう

OS の選択で Ubuntu を選択する

「Ubuntu Server 20.04.4 LTS」の32ビット版を選択します
64ビット版だとなぜか「failed to open device sdcard」のエラーで起動しません

右下の歯車からネットワークなどの設定を行う

ホスト名、ユーザ、ネットワーク情報を設定しましょう

書き込み

あとは書き込みボタンを押せばOKです
10分ほどで完了します

動作確認

RaspberryPi4 に差し込んで起動してみましょう
Imager で書き込んだ際に設定したユーザ名でログインできることを確認しましょう

最後に

ラズパイは使用するデバイス (SDカード) や OS の種類によって動作したりしなかったりするのでドラブルシューティングが大変です

64bit 版を Imager から書き込むと起動の際に「failed to open device sdcard」のエラーで起動しないので注意しましょう

2022年7月15日金曜日

RaspberryPi4 で Failed to open device sdcard が発生したので対処した

RaspberryPi4 で Failed to open device sdcard が発生したので対処した

概要

いままで問題なく動いていたのに突如 RaspberryPi4 が起動しなくなりました 原因は SD をうまく認識してくれなくなったので対処してみました

結論から先に述べておくと 32GB 以下の SD カードに変更して OS を RaspberryPiOS 32bit にすると動きました

環境

  • macOS 11.6.7
  • Raspberry Pi Imager 1.7.2

エラー詳細

RaspberryPi4 を起動すると以下のようなエラーが出てループします
どうやら SD カードが壊れてしまったのが原因っぽいです

SD カードをフォーマットし直して OS を再度書き込む

これが一番簡単な対処方法になります
ただデータが取り出せないので取り出したいデータがある場合は諦めましょう

また SD カードをフォーマットする際には必ず FAT32 でフォーマットします
MacOS の場合ディスクユーティリティを使うと MacOS 拡張というフォーマットを使うためこれで SD カードに OS を書き込んでも RaspberryPi 4 が認識してくれないので注意が必要です

ダメな場合は eprom のリセットを試してみる

SD カードに eprom をリセットするためのイメージを書き込んで差し込み起動するだけでリセットできます

画面が緑色になればリセット成功です
その後再度 SD カードに OS を書き込んで試してみてください

それでもダメな場合は USB からブートしてみる

RapsberryPi4 であれば USB からでもブートできます
同じように Imager から USB に OS を書き込んで起動できるか確認してください
この際 OS は RaspberryPiOS 32bit にしましょう
USB ブートの場合 OS が対応していないケースがあります

もし USB から起動できた場合は SD カードスロット自体が物理的に故障した可能性が高いです

USB ブート後に bootloader をアップグレードしてみる

  • vcgencmd bootloader_version
  • sudo rpi-eeprom-update -a

これで再度 SD カードからブートできるか試してみましょう

(解決方法) 32GB 以下の SD カードを使う

なぜか自分はこれで解決しました
更に OS は RaspberryPiOS 32bit になります

本当は Ubuntu 20.04 を使いたかったのですがそれだとうまく起動できずタイトルのエラーになりました

どうして SD カード (スロット) が壊れたのか

おそらくですが正常にシャットダウンする前に電源を抜き差ししたのが原因かなと思います
可能な限り RaspberryPi4 は起動しっぱなしがいいのかもしれません

もしくは電源プラグの抜き差しでオンオフしないで電源ボタンを作成してそこから起動するのがいいのかもしれません

スロットに関してははんだが外れていたりピンが切れている可能性が考えられます
これに関しては修理するのはかなり難しいかなと思います

最後に

昨日まで動いていた SD カードが急に動かなくなったのでソフトウェアな問題というよりかはハードウェア的な問題を疑ったほうが良いかなと思います

データは諦めてもいいように常にバックアップを取得しておくかクラウドサービスにアップロードしておきましょう

参考サイト

2021年11月30日火曜日

RaspberryPi4 の ds64-shell に python をインストールする

RaspberryPi4 の ds64-shell に python をインストールする

概要

ds64 環境にはデフォルトではインストールされていないのでインストールが必要です

環境

  • RaspberryPi4 8GRAM
  • RaspberryPiOS 5.10.17 armv7l

インストール

  • ds64-shell
  • sudo apt -y update
  • sudo apt -y install python3
  • sudo apt -y install python3-pip
  • pip3 install pigpio RPi.GPIO

ただ意味はないかも

「RuntimeError: Not running on a RPi!」というエラーになり gpio などの制御はできないようです

2021年11月29日月曜日

RaspberyPi でフルカラーLEDを制御してみた

RaspberyPi でフルカラーLEDを制御してみた

概要

PWM を使ってフルカラーLEDでいろんな色を点滅させてみました

環境

  • RaspberryPi4 8GRAM
  • RaspberryPiOS 5.10.17 armv7l
  • Python 2.7.16
    • pigpio 1.78

サンプルコード

後述でポイントを紹介しています
処理の概要はコメントにて記載しています

  • vim test_full_color_led.py
# -*- coding: utf-8 -*-
"""フルカラーのLEDを制御するモジュール."""
import RPi.GPIO as GPIO
import time
import logging

from logging import getLogger


class FullColorLEDTest():
    """フルカラーのLEDをテストするクラス."""

    # 各ピン定義
    RED = 11
    GREEN = 12
    BLUE = 13

    def __init__(self):
        """ピンを初期化します."""
        logging.basicConfig(level=logging.INFO)
        self.logger = getLogger(__name__)
        # RGB のカラーコードをここに記載します
        self.colors = [
            # red, green, blue, yellow, purple, cyan になります
            0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF
        ]
        pin_def = {
            self.RED: 2000,  # red
            self.GREEN: 2000,  # green
            self.BLUE: 5000,  # blue
        }
        GPIO.setmode(GPIO.BOARD)
        # 制御するピンを管理するdict
        self.pins = {
            self.RED: None,
            self.GREEN: None,
            self.BLUE: None,
        }
        # 各ピンの初期化
        for pin_num, freq in pin_def.items():
            GPIO.setup(pin_num, GPIO.OUT)
            pin = GPIO.PWM(pin_num, freq)
            pin.start(0)
            self.pins[pin_num] = pin
        self.logger.info('Started pwm pins for a full color led.')

    def calc_duty(self, x, in_min, in_max, out_min, out_max):
        """デューティー比を計算します."""
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

    def blink_color(self, col):
        """各ピンに色を設定し指定の色を光らせます."""
        # 左ビットシフト
        red = (col & 0x110000) >> 16
        green = (col & 0x001100) >> 8
        blue = (col & 0x000011) >> 0
        # デューティー比に変換 (0-100)
        red = self.calc_duty(red, 0, 255, 0, 100)
        green = self.calc_duty(green, 0, 255, 0, 100)
        blue = self.calc_duty(blue, 0, 255, 0, 100)
        # ピンにデューティー比を設定
        self.pins[self.RED].ChangeDutyCycle(red)
        self.pins[self.GREEN].ChangeDutyCycle(green)
        self.pins[self.BLUE].ChangeDutyCycle(blue)

    def blink(self):
        """フルカラーLEDを点滅させます."""
        try:
            self.logger.info('Started blinking a full color led.')
            while True:
                for col in self.colors:
                    self.blink_color(col)
                    time.sleep(0.5)
        except KeyboardInterrupt:
            pass
        finally:
            self.cleanup()

    def cleanup(self):
        """クリーンアップ処理を実行します."""
        for pin in self.pins.values():
            pin.stop()
        GPIO.cleanup()
        self.logger.info('The pin cleanup process was completed.')


if __name__ == "__main__":
    test = FullColorLEDTest()
    test.blink()

説明

今回使用したフルカラーLEDは赤青緑で3ピン必要になるのでピンを管理する dict を準備しました (この辺りはクラスにしてもいいかも)

ピンの情報と周波数も別途 dict で定義しています

init でピンの初期化を行ったあとは blink で各カラーを順番に点滅させます
点滅させたい色は self.colors で定義していので他の色を点滅させたい場合はここに追加していきます

定義したカラーコードを実際にはデューティー比に変換する必要があります
それは calc_duty で行っておりカラーコードを 0 から 100 の範囲に変換する処理を行っています

あとは変換した値を ChangeDutyCycle で各ピンに対して設定して上げれば OK です

回路

  • 11 -> 赤のピン
  • 12 -> 緑のピン
  • 13 -> 青のピン
  • 6 (GND) -> カソード

に接続するだけです
各色を管理するピンは 220 オームの抵抗を挟んで接続しています

動作確認

  • python test_full_color_led.py

で実行しましょう
以下のように順番に点滅すれば成功です

最後に

フルカラーLED と PWM を使えば好きな色の LED を光らせることができます
少しお値段が高いのが難点ですが便利です

各ピンの出力周波数に関しては参考にさせていただいたサイトの値をそのまま拝借しているだけなのでフルカラーLED の種類によっては調整の必要があるかもしれません

参考サイト

2021年11月26日金曜日

RaspberryPi4 で PWM 入門 (Lフワ)

RaspberryPi4 で PWM 入門 (Lフワ)

概要

LED を PWM というアナログ信号を使ってゆっくり点滅させてみます
サンプルコードと回路を紹介します

環境

  • RaspberryPi4 8GRAM
  • RaspberryPiOS 5.10.17 armv7l
  • Python 2.7.16
    • pigpio 1.78

サンプルコード

後述でポイントを紹介しています
処理の概要はコメントにて記載しています

  • vim test_pwm.py
# -*- coding: utf-8 -*-
"""PWMのテストをするモジュール."""
import time
import RPi.GPIO as GPIO
import logging

from logging import getLogger


class TestPWM():
    """PWMのテストをするクラス."""

    def __init__(self):
        """GPIOやピン初期化を行います."""
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(12, GPIO.OUT)
        # channel=12 frequency=50Hz
        self.pin = GPIO.PWM(12, 50)
        logging.basicConfig(level=logging.INFO)
        self.logger = getLogger(__name__)

    def start(self):
        """pinをスタートさせます."""
        self.pin.start(0)
        self.logger.info('Started a pin for pwm.')

    def blink(self):
        """LEDをPWMで点滅させます."""
        self.logger.info('Started led blinking loop.')
        try:
            while True:
                # 5 刻みでデューティー比を変更します 0 -> 100
                for dc in range(0, 101, 5):
                    self.pin.ChangeDutyCycle(dc)
                    time.sleep(0.1)
                # 5 刻みでデューティー比を変更します 100 -> 0
                for dc in range(100, -1, -5):
                    self.pin.ChangeDutyCycle(dc)
                    time.sleep(0.1)
        except KeyboardInterrupt:
            pass
        finally:
            self.cleanup()

    def cleanup(self):
        """クリーンアップ処理をします."""
        self.pin.stop()
        GPIO.cleanup()
        self.logger.info('The pin cleanup process was completed.')


if __name__ == "__main__":
    pwm = TestPWM()
    pwm.start()
    pwm.blink()

ポイント

ピンを PWM 用として使う場合に GPIO.setup したあとに GPIO.PWM を呼び出します

周波数は高いほどより電力を必要とするアクチュエータなどを動かすことができます
今回は LED なので 50Hz ほどで十分です

ChangeDutyCycle で明るさを調整します
0 から 100 までで指定することができ 0 が暗くなり 100 が明るくなります
モーターなどの場合だと 0 が遅く、100 が速く回ります

処理が終了した際に必ずピンをもとに戻す必要があるので finally でクリーンアップしましょう

回路とサンプル動画

RaspberryPi の 6 ピンが GND になっています
12 ピンを LED のアノード側に 220 オームの抵抗を挟んで接続しています

実際にスクリプトを動作させると以下のように点滅するのが確認できると思います

最後に

RaspberryPi の場合ソフトウェア PWM という仕組みで PWM を出力しています
オシロスコープがある場合は波形を確認するとちゃんとした矩形波が出ていることが確認できると思います

自分は試していませんが RaspberryPi の周波数の上限は 8,000Hz ほどのようです
DC モーターなどは何とかなりそうですがステッピングモーターなど大きなモーターの場合にはモータドライバなどを使ったほうが良いでしょう

参考サイト

2021年11月24日水曜日

RaspberryPi4 に gitlab-runner をインストールする方法

RaspberryPi4 に gitlab-runner をインストールする方法

概要

今回は shell-executor として登録します
基本は ds64 モードで勧めていますが aarch64 でもインストールできます

環境

  • RaspberryPi4 8GRAM
  • RaspberryPiOS 5.10.17 armv7l

ds64-shell の起動

作業は 64bit 環境で行います

  • ds64-shell

curl, wget のインストール

  • sudo apt -y install curl wget

証明書系のツールインストール

libgnutls30 もインストールします
これがないと git clone 時にエラーになります

  • sudo apt -y install apt-transport-https ca-certificates libgnutls30

gitlab-runner のインストール

Gitlab の公式のリポジトリからインストールします
ds64 環境ではない 64bit 環境 (aarch64) ではこの手順から実行します

  • curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
  • sudo apt-get install gitlab-runner
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  docker-engine
The following NEW packages will be installed:
  gitlab-runner
0 upgraded, 1 newly installed, 0 to remove and 90 not upgraded.
Need to get 437 MB of archives.
After this operation, 476 MB of additional disk space will be used.
Get:1 https://packages.gitlab.com/runner/gitlab-runner/debian buster/main arm64 gitlab-runner arm64 14.5.0 [437 MB]
Fetched 437 MB in 2min 10s (3,375 kB/s)                                                                                                     
Selecting previously unselected package gitlab-runner.
(Reading database ... 38144 files and directories currently installed.)
Preparing to unpack .../gitlab-runner_14.5.0_arm64.deb ...
Unpacking gitlab-runner (14.5.0) ...
Setting up gitlab-runner (14.5.0) ...
GitLab Runner: creating gitlab-runner...
Home directory skeleton not used
Runtime platform                                    arch=arm64 os=linux pid=2632 revision=f0a95a76 version=14.5.0
gitlab-runner: the service is not installed
Runtime platform                                    arch=arm64 os=linux pid=2643 revision=f0a95a76 version=14.5.0
gitlab-ci-multi-runner: the service is not installed
Runtime platform                                    arch=arm64 os=linux pid=2673 revision=f0a95a76 version=14.5.0
Runtime platform                                    arch=arm64 os=linux pid=2721 revision=f0a95a76 version=14.5.0
INFO: Docker installation not found, skipping clear-docker-cache

runner の登録

Gitlab の URL とトークンを入力して登録します
executor は「shell」を入力しましょう

  • sudo gitlab-runner register

また gitlab-runner ユーザに gpio 関連を操作できるように権限を与えます

  • sudo usermod -aG gpio gitlab-runner

動作確認

プロジェクトに以下のような .gitlab-ci.yml を登録して成功するか確認しましょう

stages:
  - stage1
  - stage2

.echo1_script: &echo1_script
  - "export MSG=hello"
  - "echo ${MSG}"
  - "export MSG=HELLO"

.echo2_script: &echo2_script
  - "echo ${MSG}"

echo:
  image:
    name: alpine:latest
  stage: stage1
  script:
    - *echo1_script
    - *echo2_script

停止する場合は ds64-shell で

  • sudo systemctl stop gitlab-runner

再度起動する場合は ds64-shell で

  • sudo systemctl start gitlab-runner

します

トラブルシュート

server certificate verification failed. CAfile: 
/home/gitlab-runner/builds/QopMjzNB/0/root/project1.tmp/CI_SERVER_TLS_CA_FILE CRLfile: none

が出る場合は libgnutls30 がちゃんとインストールされているか確認しましょう
エラー文でググると証明書を自分で作成したりする記事が出てきますがそれだとダメなので気をつけましょう

Gitlab と通信できるようにファイアウォールなどの設定も確認しましょう

最後に

少しハマるポイントがありましたがインストールして動作しました

ds64 モードで紹介しましたが普通に armv7 でも動くかもしれません

参考サイト

2021年11月17日水曜日

RaspberryPi4 (8GB RAM) で一ヶ月間 Monero をマイニングした結果

RaspberryPi4 (8GB RAM) で一ヶ月間 Monero をマイニングした結果

概要

タイトルの通りです
参考データとして紹介します

環境

  • RaspberryPi4 ModelB 8GB
  • RaspberryPiOS 5.10.17 armv7l
  • xmrig 6.15.2

結果

0.00049521 XMR

一日平均

0.00001597 XMR

稼働時間

ほぼ24時間
金曜日の一部 (約 7 時間ほど) だけ停止

稼働オプション

donate-level は 1 です
xmrig は直接 RaspberryPi 上で動作させています (docker 上ではないです)

arm7v アーキテクチャでは xmrig は動作しないので ds64 化して動かしています (参考)

平均ハッシュレート

120 hash/sec

下が 90 で上が 300 くらいブレがありそれを平均すると 100 - 130 ほどで推移していることになりました

交換可能になるまで

交換可能 XMR は執筆時点で 0.01 XMR です
これになるには一ヶ月 0.0005 XMR だとすると

  • 0.01 / 0.0005 = 20 ヶ月

になります
約 2 年ほどフル稼働させればようやく交換可能な値になります

最後に

電気代は計算していませんが1ヶ月100円ほどだとすると 20 ヶ月する稼働でも 2,000円ほどなので 0.01 XMR = 300円で余裕で赤字という結果になりました

将来的に Monero が跳ねれば話は別ですが、、

2021年10月18日月曜日

RaspberryPi4 で xmring のビルド

RaspberryPi4 で xmring のビルド

概要

そのままだと 32bit しか対応していないので 64bit の仮想完了を構築してからビルドする必要があります

環境

  • RaspberryPi4 8GRAM
  • RaspberryPiOS 5.10.17 armv7l

raspbian-nspawn-64 のインストール

  • sudo apt-get update
  • sudo apt-get install -y raspbian-nspawn-64
  • sudo reboot -h now

xmrig のビルド

  • ds64-shell
  • sudo apt-get -y update
  • sudo apt-get -y install git build-essential cmake libuv1-dev libssl-dev libhwloc-dev
  • git clone https://github.com/xmrig/xmrig.git
  • cd xmrig
  • mkdir build
  • cd build
  • cmake … -DCMAKE_BUILD_TYPE=Release -DWITH_OPENCL=OFF -DWITH_CUDA=OFF
  • make

systemd 化

一度 ds64-shell を抜けます

  • chmod +x /home/pi/xmrig/build/xmrig
  • mkdir /home/pi/xmrig/log
  • touch /home/pi/xmrig/log/xmrig.log
  • sudo vim /lib/systemd/system/xmrig.service
[Unit]
Description=cpu-monero-miner
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/ds64-run /home/pi/xmrig/build/xmrig --url=pool.supportxmr.com:5555 --donate-level=1 --user=44pxxx --pass=docker -k --coin=monero --log-file="/home/pi/xmrig/log/xmrig.log" --cpu-max-threads-hint 25

[Install]
WantedBy=multi-user.target

cpu-max-threads-hint は 4コアなので 25, 50, 75, 100 が指定できます
1 コアしか使わない場合は 25, 4 コアすべて使う場合は 100 を指定します

  • sudo systemctl daemon-reload
  • sudo systemctl enable xmrig
  • sudo reboot -h now
  • sudo systemctl start xmrig

Tips

ds64-shell を抜けるには Ctrl + ] を素早く 3 回押します

最後に

armv7 の CPU アーキテクチャに対応していないとこういうことをする必要が出てきます

参考サイト

2021年10月17日日曜日

RaspberryPi4 設定メモ

RaspberryPi4 設定メモ

概要

自分用セットアップメモです

環境

  • RaspberryPi4 ModelB 8GBRAM

必要なもの

  • 最低限
    • microSD (SD カード変換)
  • 任意
    • 5V/3A 電源アダプタ
    • 有線キーボード
    • Bluetooth キーボード (つながらないかも)
    • Bluetooth マウス
    • microHDMI ケーブル

RaspberryPiOS の準備

こちら
Wifi の設定と SSH の有効化はここで済ませる

ssh の有効化

Imager で行う

Wifi のセットアップ

SSID の登録
事前に Imager で済んでいる場合は不要

  • sudo vim /etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ap_scan=1

update_config=1
network={
        ssid="ssid"
        psk=xxx
}

キーボードのセットアップ

caps lock -> ctrl

  • sudo vim /etc/default/keyboard
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS="ctrl:swapcaps"
BACKSPACE="guess"

Bluetooth キーボードのセットアップ

GUI から行う
CLI で行うことはできるのだろうか

docker のインストール

alpine 3.13 だとネットワークエラーになるので alpine 3.12.3 を使うこと https://github.com/docker/for-linux/issues/1196

raspbian-nspawn-64 のインストール

  • sudo apt-get update
  • sudo apt-get install -y raspbian-nspawn-64
  • ds64-shell

電源電圧が足りているか調べる

  • vcgencmd get_throttled
  • vcgencmd mesure_temp

pi-apps のインストール

各種ツール

apt or linuxbrew でインストールすること

2021年10月16日土曜日

Raspberry Pi Imager を使ってラズパイ用の OS を microSD カードに書き込む方法

Raspberry Pi Imager を使ってラズパイ用の OS を microSD カードに書き込む方法

概要

昔は img ファイルをダウンロードして dd コマンドで SD カードに書き込んでいましたが最近では Imager 経由で簡単に SD カードに書き込めるようです

この段階から OS の設定もいくつかできるので初期設定も Imager に任せることができます

今回はインストール方法を実際の書き込み方法を紹介します

環境

  • macOS 11.6
  • Raspberry Pi Imager 1.6.2

ダウンロード

ここからダウンロードします

imager_1.6.2.dmg というファイルがダウンロードできました

インストール

ダウンロードできた dmg ファイルをダブルクリックし展開しましょう
あとは app ファイルを Applications フォルダ配下に移動するだけで OK です

起動

アプリケーション配下にある「Raspberry Pi Imager.app」を開きます

初回起動の場合は以下のような警告が表示されますが「開く」を押して続けます

Raspberry Pi Imager が起動すれば成功です

SDカードの接続

Mac に SD カードを接続します
自分は microSD -> SDカードの変換を使って接続しました

書き込み先の選択

「CHOOSE STORAGE」から接続した SD カードを選択します

書き込みOSの選択

次に「CHOOSE OS」から書き込む OS を選択します
今回は「Raspberry Pi OS (32-bit)」を選択します

まだフォーマットされていない場合は先に Erase を選択してフォーマットしてもいいかもしれません

オプションの設定

画面にはないのですがいろいろとオプションを設定できます 「Cmd + Shift + x」を入力しましょう

すると以下のようなダイアログが表示されるので好きなオプションを設定していきます

自分は以下を設定するようにしています

  • Enable SSH
  • Configure wifi
  • Set locale settings

ちなみにここで設定した項目は保存することもできるので別の SD カードでも同じ設定を使い回すことができます

書き込み

あとは「Write」で書き込みします
管理者権限のダイアログが表示される場合はパスワードを入力して権限を与えましょう

あとは書き込みが終わるまで待ちます

SD カードの書き込み速度にもよりますがだいたい 20 分ほどで完了すると思います

動作確認

あとは Raspberry Pi に SD カードを挿して起動すれば OK です

ちゃんとオプションで設定した通りに初期化されていることを確認しましょう

最後に

Wifi など起動後に設定する場合はモニタが必要であったりキーボードやマウスの接続が必要だったのですが Imager を使うとその辺りの設定を書き込み時に行えるので起動後は SSH すればいきなり使えるようになっているのはかなり嬉しい点かなと思います

ただ Bluetooth 関連の設定はできなかったのが残念です
Bluetooth キーボードの自動接続などもこの段階でできると更にうれしいかなと思いました

自分で SD カードに直接設定ファイルを配置する方法もあるようですが今回は省略します

参考サイト

2019年8月22日木曜日

RaspberryPi の起動ボタンを作成する

概要

RaspberryPi Zero を毎日自動で停止しているのですが起動するのに毎回アダプタを抜く or USB を抜くのが面倒なのでスイッチを作成しました

環境

  • Raspberry Pi Zero 512MB
  • Raspbian 10.0 (Buster)
    • Linux raspberrypi 4.19.57+

ブレッドボードでテスト

GPIO3 と GND をタクトスイッチにつなぐだけです

これでタクトスイッチを 3 秒くらい長押ししていると RaspberryPi が起動します

ユニバーサル基板化

ブレッドボードだと邪魔なのでユニバーサル基板を使ってシールド化しました

接続完了

RaspberryPi とシールドを接続すると以下のようになります
こっちのほうがスリムで良いです

参考サイト

2019年8月20日火曜日

RaspberryPi の Wifi ドングルが安定しないときの対策

概要

RaspberryPi を無線 LAN にする際に欠かせない Wifi ドングルですがルータなどの相性もあるようで頻繁に接続が切れたりします
そんなときに極力安定させる方法を紹介します

環境

  • Raspberry Pi Zero 512MB
  • Raspbian 10.0 (Buster)
    • Linux raspberrypi 4.19.57+

まずは原因切り分け

自分が経験した感じ原因は

  • ルータ側
  • RaspberryPi 側

のどちらかになります
まずはこれのどちらかを切り分けしましょう

具体的なやり方としては「ルータ (アクセスポイント) を変えて安定するか確かめる」になります
例えばモバイルルータ (WiMax2 やどんなときも Wifi など) を契約しているのであれば、まずそのルータと RaspberryPi を無線接続して安定するか確かめます
そして次に別のルータやアクセスポイントと接続して安定して確かめます
簡単に用意できるのはスマホのテザリングかなと思います

この結果として

  • RaspberryPi との無線接続が不安定になるルータがある
  • どのルータでも無線接続が不安定になる

のであればルータが原因の場合があります
ルータの dhcp や Mac アドレスフィルタリングなどの設定を確認してみましょう
ただこの場合でも RaspberryPi 側に原因がある可能性があるので次に RaspberryPi 側で取れる対策を紹介します

Wifi ドングルが対応しているか確認する

自分は RaspberryPi で動作しない Wifi ドングルに出会ったことがあります (参考)

基本的には Raspbian にドライバがインストールされていれば動作します
が、ドライバがあっても動作しないケースもあるようです
自分が遭遇したのは Buffalo の WLI-UC-GNM2S というドングルでこれはドライバがあってもうまく動作しませんでした

ではどれを使うのが良いのかという話になるのですがそれはこのあと紹介します

Wifi ドングルの熱暴走を止める

これが一番の原因かもしれません
「再起動直後は安定しているけどしばらくすると接続が切れる」という症状の場合はおそらく熱暴走が原因です

対策としては

  • Wifi ドングルが複数ある場合はドングル同士を離す
  • 他のドングルがある場合はそれらのドングルを極力使用しない or ドングルとの距離を離す
  • ファンを取り付ける (おすすめ)
  • ヒートシンク (できればファンにしたい)

かなと思います
ドングル同士を離すのは単純にドングル同士が近いほうがお互いに発熱して更に熱暴走の可能性が上がるからです

あとは物理的に冷やしましょう
自分の経験上一番効果があったのがファンなのでファンの取り付けをおすすめします
「どうやって Wifi ドングルにファンを取り付けるの?」と思う方いると思いますが自分は単純に小型の扇風機あてています
ただファンのデメリットはファンの音がうるさいというのがあります
あとはヒートシンクですがこれはそこまで効果がないと思います
付け方とヒートシンクの数にもよると思いますがファンほど冷却効果はないかなと思います
ただヒートシンクのほうが安価で済みます

Bluetooth ドングルと干渉しないようにした

これは電波干渉の話です
Bluetooth ドングルが近くにある場合は少し離してみましょう
あとは電子レンジです
電子レンジと Wifi の 2.4GHz は互いに干渉し合うのでなるべく電子レンジの近くにルータおよび RaspberryPi を置かないようにしましょう

最適な Wifi ドングルに買い換える

自分が持ってる Baffalo の WLI シリーズは正直おすすめしません
他のサイトでいろいろと紹介しているのでそれを参考にするのが一番かなと思います

あとは正直ルータとの相性もあるので試してみないと分からないというのが一番です
ただ、少なくとも自分が持っている WLI シリーズはとても安価ですか RaspberryPi で使用するのはおすすめしません

RaspberryPi3 の内蔵 Wifi ドングルでも同じことが言えるかもしれない

「RaspberryPi Wifi 不安定」あたりでググるとよく RPi3 の内蔵 Wifi ドングルで不安定になるという記事が出てきます
実はこれも熱暴走をしている可能性はありそうです
自分は RPi3 を持っていないので試せていませんが試す価値はあるかなと思います

最後に

RaspberryPi の Wifi ドングルの無線接続を安定させる方法を紹介しました
ルータとの相性もあるので正解を探すのが正直難しいです
最大のポイントは「相性の良い Wifi ドングルを購入する」のが一番かなと思います
更に発熱が小さいドングルを選択すればなお良いと思います

ただ小型の Wifi ドングルはどうしても発熱してしまうのでやはり別途冷却する仕組みがないと厳しいかなと思います

参考サイト

2019年8月17日土曜日

RaspberryPi をモバイルルータの拡張アクセスポイントとして構築する

概要

モバイルルータは端末の同時接続数に制限が設定されていることが多いです
ルータに接続できる端末の上限に達した場合などは新たにアクセスポイントを作成する必要があります
今回は RaspberryPi を使ってモバイルルータ用のアクセスポイントを増設してみました
なお Zero を使っていますが Zero でなくても問題ないです

環境

ドングル接続

まずは RaspberryPi に USB ドングルを 2 つ接続しましょう
すでに wlan0 を使っている場合は wlan1 が追加されます
wlan0 と wlan1 で使いたいドングルが異なる場合は接続する順番を調整してインタフェースとドングルを合わせてください

wlan1 の IP 固定化

wlan0 はこれまで通りモバイルルータに接続してインターネットに接続します
wlan0 のみモバイルルータに接続するように wpa_supplicant-wlan0.conf を作成しておきます

そしてアクセスポイントとなる wlan1 の IP を固定化します

  • sudo vim /etc/network/interfaces
allow-hotplug wlan1
iface wlan1 inet manual

自動で IP が振られないように iface wlan1 inet manual を設定します

  • sudo vim /etc/dhcpcd.conf
interface wlan1
static ip_address=192.168.130.1/24
static routers=192.168.130.1
static domain_name_servers=192.168.130.1
static broadcast 192.168.130.255

wlan1 配下にぶら下がったデバイスには 192.168.130.0/24 のネットワーク帯から IP が振られるようにします

hostapd のインストールと設定

  • sudo apt install -y hostapd

インストールできたら設定ファイルを作成します

  • sudo vim /etc/hostapd/hostapd.conf
interface=wlan1
driver=nl80211
ssid=ap1
hw_mode=g
channel=7
wmm_enabled=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=hogefuga
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

interfacewlan1 にしましょう
ssidwpa_passphrase 好きなものを設定しましょう
wpa_passphrase は平文のパスワードを設定します
他も基本的にはそのままで OK です
channel あたりは各自の環境に合わせて適宜変更しても良いかもしれません
ctrl_interface に関しては hostapd_cli を使うための設定です

  • sudo vim /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"
DAEMON_OPTS="-dd -t -f /home/pi/hostapd.log"

設定ファイルのパスを記載します
またログをファイルに出力するようにしておきます

  • sudo systemctl unmask hostapd
  • sudo systemctl enable hostapd
  • sudo systemctl start hostapd
  • sudo systemctl status hostapd

これでアクセスポイントが見えるようになっていれば成功です
この状態では接続まではできないのでルーティングと dhcp の設定をします

ルーティング設定

wlan0 経由でちゃんとモバイルルータを使ってインターネットに出れるようにします

  • sudo vim /etc/sysctl.conf
net.ipv4.ip_forward=1
  • sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
  • sudo iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
  • sudo iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT

確認は sudo iptables -t nat -n -L で行います
RaspberryPi が再起動した場合でも自動でルーティング情報が適用されるように rc.local に記載しておきます

  • sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
  • sudo vim /etc/rc.local
iptables-restore < /etc/iptables.ipv4.nat

dhcp サーバのインストールと設定

  • sudo apt install -y isc-dhcp-server

dnsmasq でもできるなのでここはお好みでも良いかもしれません
あとは wlan1 に設定した固定 IP の範囲から IP を払い出す設定を記載します

  • sudo vim /etc/dhcp/dhcpd.conf
subnet 192.168.130.0 netmask 255.255.255.0 {
  range 192.168.130.10 192.168.130.100;
  option broadcast-address 192.168.130.255;
  option routers 192.168.130.1;
  default-lease-time 600;
  max-lease-time 7200;
  option domain-name "local";
  option domain-name-servers 8.8.8.8, 8.8.4.4;
}
log-facility local7;

log-facility はどちらでも良いです
これを記載すれば dhcpd のログが /var/log/messages に出力されるようになります

あとはインタフェースの設定をしてプロセスを起動しましょう

  • sudo vim /etc/default/isc-dhcp-server
INTERFACESv4="wlan1"
  • sudo systemctl start isc-dhcp-server

ここまでで wlan1 に固定 IP が振られていてアクセスポイントが見えるようになっていて dhcp サーバが起動していれば動作するはずです

動作確認

  • sudo reboot -h now

とりあえずこれまでの設定を反映させるために再起動しましょう
hostapdisc-dhcp-server も自動で起動するはずです
ただ isc-dhcp-server だけは wlan1 に IP が振られていないと起動してくれません
wlan1 に IP が振られるのは hostapd が起動してからです
なので hostapd が起動する前に isc-dhcp-server が起動してしまうと dhcpd がうまく起動していないのでその場合は手動で起動しましょう

  • sudo systemctl start isc-dhcp-server

あとは iPhone などからアクセスポイントを探して設定したパスフレーズで接続できることを確認しましょう
接続できない場合はルーティングや dhcpd の設定がおかしい場合が多いようです
対策としては /etc/rc.local に以下の記載します

/bin/sleep 30 && /etc/init.d/isc-dhcp-server start

そして isc-dhcp-server を自動起動しないようにしておけば大丈夫だと思います

  • sudo systemctl disable isc-dhcp-server

おまけ: WLI-UC-GNM2S は RaspberryPi では動作しなかった

今回使用した Wifi の USB ドングルは「BUFFALO 無線LAN子機 コンパクトモデル 11n技術・11g/b対応 WLI-UC-GNM」というドングルです
実はこれもう生産自体が終了しており Amazon などでは手に入るようですが少しお値段が張ります
後継機として WLI-UC-GNM2 や WLI-UC-GNME などがあるようですが WLI-UC-GNM2S というのが最新の後継機としてあるようです

これでも使えるかなと思って購入してみたのですが自分の RaspberryPi 環境では動作しませんでした
アクセスポイントを張ることはできるのですが接続することができませんでした
ドライバは RT3070 でこのドライバ自体は Raspbian 10.0 や 9.0 には問題なくインストールされているので lsusb などで認識はするのですが iwlist wlan0 scan などでアクセスポイントを見つけようとして見つかりません
せっかく購入したので何とか解決できないが頑張りましたがダメでした、、

おまけ: hostapd.conf を変更した場合は dhcp サーバも再起動しましょう

  • sudo systemctl restart hostapd
  • sudo /etc/init.d/isc-dhcp-server restart

おまけ: 速度について

個人的にですが直接モバイルルータに接続している状態と RaspberryPi のアクセスポイントに接続している状態では回線速度は 1/8 から 1/10 くらいに下がります
RaspberryPi のスペックや Wifi ドングルの熱の状態にもよりますが基本的には RaspberryPi を経由したほうが遅くなるので注意しましょう

最後に

RaspberryPi を使ってモバイルルータのためのアクセスポイントを作成してみました
大抵のモバイルルータは同時接続に制限があるのでその場合は役に立つかなと思います
まだ運用して間もないのでこれから問題が出てくるかもしれません
とりあえず一番気になるのはドングルの発熱かなと思います
2 つドングルを接続すると USB ポートの部分が結構な熱さになるので熱暴走したり破損したりしないか心配です

あとは単純に RaspberryPi Zero のスペックが低いので大量のデバイスを接続してしまうと通信が重くなってしまうかなと思います
この辺のモバイルルータか RaspberryPi かどちらに接続するかのバランスも大事になってくるかなと思います

いろいろわかったらまた別記事で紹介したいと思います

参考サイト

2019年8月16日金曜日

RaspberryPi 設定メモ

  • https://www.raspberrypi.org/downloads/raspbian/ からフルをダウンロード、解凍
  • SD を Mac に入れてディスクユーティリティからフォーマットする (Mac OS 拡張ジャーナリング)
  • sudo diskutil umount /Volumes/boot
  • sudo dd bs=1m if="./2019-07-10-raspbian-buster-full.img" of="/dev/rdisk2"
  • SD を Rpi に入れて起動、マウス、Wifi、Bluetooth ドングルを指すのを忘れずに、キーボードは一旦有線
  • bluetooth キーボード設定、完了したら有線キーボードは抜く (GUI)
  • wifi 設定 (GUI)
  • sudo vim /etc/default/keyboard
    • 'XKBOPTIONS="ctrl:nocaps"'
  • sudo apt -y install ruby ruby-dev vim
  • sudo gem install bundler
  • Preferences -> Raspberry Pi Configuration から SSH を有効にする
  • crontab
    • 5 4 * * * sudo shutdown -r now
  • sudo vim /etc/rsyslog.conf
    • cron.* /var/log/cron.log

2019年8月15日木曜日

ラズパイで wpa_supplicant.conf を インタフェースごとに設定する方法

概要

例えば 2 つのドングルを挿している場合にそれぞれ別の無線 LAN に接続したい場合があると思います
そんな場合にはそれぞれで wpa_supplicant.conf を作成してあげましょう

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 9.4

方法

wpa_supplicant-wlan0.confwpa_supplicant-wlan1.conf を作成してあげれば OK です
既存のファイルがある場合は名前を変更すれば OK です

  • cd /etc/wpa_supplicant
  • sudo mv wpa_supplicant.conf wpa_supplicant-wlan0.conf
  • wpa_cli reconfigure

wpa_cli reconfigure してもダメな場合は再起動しましょう

  • sudo reboot -h now

目的のインタフェースに目的のネットワークが設定されていない場合は

基本はラズパイ側のインタフェースに合わせて wlan0 or wlan1 が決まります
一番てっとり早いのはドングルを物理的に入れ替えれば OK です

ドングルによっては親機/子機と役割がある場合があるので適切なドングルに適切な wlan が振られているか確認しましょう

参考サイト

2019年2月11日月曜日

RaspberryPi に SoftEther をインストールしてローカルな環境から VPN 接続してみた

概要

Azure 経由及び DDNS ではアクセスできませんでした
一応インストール手順や設定手順の備忘録として残しておきます

環境

  • RaspberryPi Model B Rev 2 (512MB)
  • Raspbian 9.4 (4.14.79+)
  • SoftEther vpnserver 4.28 Build 9669
  • macOS 10.14.2

Server インストール

ここから Server をダウンロードします

softether-vpnserver-v4.28-9669-beta-2018.09.11-linux-arm_eabi-32bit.tar.gz というファイルの名前がダウンロードできました
これは RaspberryPi 上に配置しましょう
やっていることは単純で解凍して make でビルドし作成されたバイナリファイルを配置しているだけです
おまけとして systemd 配下で動くように service ファイルを作成しました

  • tar zvxf softether-vpnserver-v4.28-9669-beta-2018.09.11-linux-arm_eabi-32bit.tar.gz
  • cd vpnserver
  • make
    • EULA に同意します
  • cd ..
  • sudo mv vpnserver/ /usr/local/
  • sudo touch /lib/systemd/system/vpnserver.service
  • sudo vim /lib/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target
  • sudo systemctl enable vpnserver
  • sudo systemctl start vpnserver

Manager インストール

Mac 上にインストールします
これは RaspberryPi 上にインストールした vpnserver の設定を行うための管理ツールです

先程のダウンロードサイトから Manager をインストールしましょう

softether-vpnserver_manager-v4.21-9613-beta-2016.04.24-macos-x86-32bit.pkg という名前のファイルがダウンロードできました
インストールすると「VPN Server Manager.app」というアプリができます

まずは「New Setting」で vpnserver に接続します
管理用のパスワードが設定されていない場合は最初に設定することになります

作成できたら「Connect」を選択して接続しましょう

VPN のタイプを選択します
今回は「Remote Access VPN Server」を選択します

DDNS の設定を行います
ホスト名部分は自分で決定することができます
グローバルな IP はプロバイダによっては 固定でない場合があります
その場合にはここで払い出されば DNS にアクセスするとインターネットからアクセスすることができます

L2TP/IPsec の設定をします
今回は Mac から接続テストを行うので有効にします
また接続する仮想ハブを選択します
まだ仮想ハブがない場合は作成してください (デフォルトだと「VPN」という名前になります)
また IPSec 接続のために共有鍵も設定しましょう (好きな文字列で OK)

VPN 接続するためのユーザの作成を行います
「Create User」を選択しましょう

ユーザ名とパスワードの部分は必須です
今回は Auth Type に「Password Authentication」を選択しましたがこれ以外でも問題ありません
それ以外でポリシーやグループを指定することもできます

基本的な設定が完了すると一覧画面に戻ります
さらにここから NAT の設定をします

「Manage Virtual Hub」を選択し右下の「Virtual NAT and Virtual DHCP Server (SecureNAT)」を選択します

SecureNAT を有効にします
「Enable SecureNAT」を選択しましょう

おまけ: vpncmd

上記の設定は RaspberryPi (vpnserver) 上でも可能です
vpncmd コマンドを使いましょう

  • /usr/local/vpnserver/vpncmd

Client インストール

今回は Mac から接続テストを行うので Mac 標準の VPN クライアントを使います
Windows や Linux の場合は SoftEther 専用のクライアントがあるのでそれを使うと良いと思います

「ネットワーク 環境設定」から新規でネットワークを追加します
インタフェースは「VPN」、タイプは「L2TP over IPSec」サービス名は「VPN (L2TP)」を選択します

vpnserver をインストールした RaspberryPi の IP アドレスを入力しましょう
(ここに DDNS のドメインを入力すればグローバル経由で VPN が張れます)

あとは「認証設定」から作成した VPN 接続用ユーザのパスワードと IPSec 用の事前共有鍵を入力しましょう

入力できれば「適用」->「接続」で VPN 接続確認してみてください
問題なくつながると思います
つながらない場合は RaspberryPi 側でファイアウォールが有効になっていたりしていないか確認してみてください

断念したグローバルからの接続

実は DDNS での接続を諦めています
また DDNS がダメだった場合のために Azure VPN を使った接続方法もあるのですがそれも断念しています

理由は特定できなかったのですが、おそらく自宅のルータの (601HW) が VPN パススルーに対応していないのが原因かなと思います
ポートマッピングで L2TP に必要なポートを入れてみましたがダメでした

ping も有効にしてそもそも ping が通るかなども試しましたがダメでした
またローカルブリッジを作成して試してもみましたがダメでした

もし解決する方法があれば教えてほしい、、、

最後に

RaspberryPi に SoftEther をインストールして宅内 VPN を試してみました
基本的なインストール方法や設定方法は理解できたと思います

が、肝心の DDNS or Azure VPN を使ったグローバルからのアクセスができませんでした
ちょっと別の環境で試してみて同じ設定でできるようであれば確実にルータのせいかなと思います

参考サイト