SSブログ

SPRESENSE用”CircuitPython”のビルド環境を作ろう!(WSL設定編) [SPRESENSE]

SPRESENSE用"CircuitPython"のビルド環境の続きです。WSLのUbuntuのインストールが終わったら、次は開発環境を設定します。


image-3.png


今回は少し時間がかかりますので、コーヒーでも飲みながら気長にやっていきましょう。開発環境の設定は次のサイトを参考にさせていただきました。(ありがとうございます)


WSLでWindowsの中にLinuxの開発環境を作ろう
https://qiita.com/h-yoshikawa/items/15653d08f917ad6e39f8


最初に日本語化と日本時間の設定を行います。次の順番でコマンドを入力してください。(各コマンドを打った際に表示されるメッセージは省略しています)


$ sudo apt update
$ sudo apt install -y language-pack-ja
$ sudo apt install -y manpages-ja manpages-ja-dev
$ sudo update-locale LANG=ja_JP.UTF-8
$ sudo dpkg-reconfigure tzdata



ここでコンフィギュレーションの画面が出てきますので[Asia][Tokyo]に設定します。


2020-05-12.png

[Tab]キーでOKに移動できます。ちなみに日本の都市名はTokyo以外はありません…。

2020-05-12 (1).png


次からいよいよ"Linuxbrew"をインストールします。次の順番にコマンドを打ってください。
ここからは、一つ一つのコマンドにかなり時間がかかります。


$ sudo apt install build-essential curl file git

   .... 時間かかります ....

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

   .... さらに時間かかります....

$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >>~/.profile
$ source ~/.profile
$



これで、"Linuxbrew" が使えるようになります。ここで一点注意があります。二つ目のコマンドが "Linuxbrew"のインストールになるのですが、次のようにインストールの途中で続けるかどうか聞いてきます。


$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)" [sudo] Enter password for xxxx to install Ruby: ==> Installing Ruby to /home/linuxbrew/.linuxbrew/Homebrew/Library/Homebrew/vendor ... 省略 ... /home/linuxbrew/.linuxbrew/Caskroom /home/linuxbrew/.linuxbrew/Frameworks Press RETURN to continue or any other key to abort


ここで放って置くと、そのまま "abort" してしまいますので、時々コンソールを覗いてキー待ちになっているか見ておきましょう。

次にGCCをインストールします。


$ brew install gcc

   ... ここも時間かかります ...

$ echo 'export LDFLAGS="-L/home/linuxbrew/.linuxbrew/opt/isl@0.18/lib"' >> ~/.profile
$ echo 'export CPPFLAGS="-I/home/linuxbrew/.linuxbrew/opt/isl@0.18/include"' >> ~/.profile
$ echo 'umask 002' >> ~/.profile
$ source ~/.profile
$




これで設定完了です。最後に正しく設定されているか確認をします。


$ brew doctor
Your system is ready to brew.
$



このメッセージが出てきたら設定完了です!お疲れ様でした。😄

次はいよいよ "CircuitPython" の開発環境の設定です。
(^^)/~





WSL構築と利用―Windows10で利用するLinux環境

WSL構築と利用―Windows10で利用するLinux環境

  • 作者: 川口 直也
  • 出版社/メーカー: カットシステム
  • 発売日: 2020/01/01
  • メディア: 単行本



Ubuntuスタートアップバイブル

Ubuntuスタートアップバイブル

  • 作者: 小林 準
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2018/07/30
  • メディア: 大型本



ちょっとだけLinuxにさわってみたい人のための Bash on Ubuntu on Windows入門

ちょっとだけLinuxにさわってみたい人のための Bash on Ubuntu on Windows入門

  • 作者: 中島能和
  • 出版社/メーカー: 秀和システム
  • 発売日: 2017/03/30
  • メディア: Kindle版




nice!(19)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE用”CircuitPython”のビルド環境を作ろう!(WSLインストール編) [SPRESENSE]

SPRESENSE用のCircuitPythonのビルド環境にはLINUXの環境が必要です。Windows10の場合はWSL(Windows Subsystem for Linux )を使うことができます。


image-3.png


WSLはお使いの Windows10 に内蔵されており設定で機能を有効にするだけです。コントロールパネルの”プログラム”メニューの中の”Windowsの機能の有効化また無効化”を選択します。


2020-05-10.png


すると、ダイアログウィンドウが現れますのでその中から ” Windows Subsystem for Linux”の項目をチェックします。


2020-05-10 (1).png


ダイアログを閉じると再起動が促されますので再起動します。

これでまだ終わりではありません。次に”Microsoft Store”を開いて、"Ubuntu" と検索します。いくつか異なるバージョンのものが引っかかりますが、ここは迷わず "Ubuntu" を選択しましょう。 (最新版がインストールされるようです)


2020-05-11 (1).png


インストールしたのちにアイコンをクリックするとコンソールが現れユーザー名・パスワードを設定するよう促されるので、自分の好みのユーザー名・パスワードを設定すれば完了です!


2020-05-11 (2).png


しかし、Windowsでこんなに簡単にLinux(Unix)が使えるとは時代は変わりましたねぇ。
次はWSLに開発環境をセットアップしたいと思います。🙂
(^^)/~






WSL構築と利用―Windows10で利用するLinux環境

WSL構築と利用―Windows10で利用するLinux環境

  • 作者: 川口 直也
  • 出版社/メーカー: カットシステム
  • 発売日: 2020/01/01
  • メディア: 単行本



Ubuntuスタートアップバイブル

Ubuntuスタートアップバイブル

  • 作者: 小林 準
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2018/07/30
  • メディア: 大型本



新しいLinuxの教科書

新しいLinuxの教科書

  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2017/06/08
  • メディア: Kindle版




タグ:ubuntu WSL Spresense
nice!(21)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE用”CircuitPython”のビルド環境を作ろう!(目次編) [SPRESENSE]

前回、SPRESENSEのプリビルドで CircuitPython を動かしましたが、せっかくなのでSPRESENSE 用の "CircuitPython" のビルド環境を整備することにしました。


python-spresense.png
https://github.com/adafruit/circuitpython


SPRESENSEには、"CircuitPython" にはない機能が沢山あるので、コントリビューションするなら今がチャンスですよ!!😀

ビルド環境は、AdaFruit の CircuitPython の GitHub に記載されていますが、かなり大雑把なので、備忘録を兼ねて記録していきたいと思います。大まかには次の4ステップになります。



【STEP1】WSL (Windows Subsystem for Linux) を準備する
【STEP2】WSL(Ubuntu)に開発環境を設定する
【STEP3】CircuitPython のビルドツリーを用意する
【STEP4】CircuitPython をビルドしてSPRESENSEで動かす




STEP3以降が、やや込み入っているので後日アップしていきたいと思います!このページはそれぞれの手順へのリンクを貼っていきますので、目次として使ってください。
(^^)/~





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware










nice!(23)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE で "CircuitPython" を動かしてみた! [SPRESENSE]

SPRESENSE で CircuitPython が動くのは知っていたのですが、試したことはありませんでした。最近、Python を使うことが増えてきているので、気分転換に試してみることにしました。


2020-05-08 (2).png
https://learn.adafruit.com/welcome-to-circuitpython/overview


試してみるのはとっても簡単でした。細かい手順は上のURLにあるのですが、手っ取り早く動かしたい方は次の3ステップでOK。


STEP1:SPRESENSE の CircuitPython イメージをダウンロードする


Adafruit の公式ページから、SPRESENSEの CircuitPython イメージをダウンロードしましょう。 "adafruit-circuitpython-spresense-en_US-5.3.0.spk" という ".spk" という拡張子がついたファイルが取得できます。


2020-05-09 (1).png
https://circuitpython.org/board/spresense/


STEP2:ダウンロードしたイメージを SPRESENSE に焼きこむ


ここは少し面倒。すでに Arduino の環境が整っている方が前提です。 SPRESENSE の Arduino 環境の設定の仕方は次のURLを参照してください。

Spresense Arduino スタートガイド
https://developer.sony.com/develop/spresense/docs/arduino_set_up_ja.html


このライブラリの中に flash_writer が同梱されています。(Windows前提ですが)次の場所にあります。

%USERPROFILE%\AppData\Local\Arduino15\packages\SPRESENSE\tools\spresense-tools\1.5.0\flash_writer\windows\flash_writer.exe



コマンドラインやCygwin等で次のように打ち込めばイメージを焼きこめます。SPRESENSE が接続されているシリアル (COMxx) は、コントロールパネル等で確認してください。

# ./flash_writer.exe -c COMxx adafruit-circuitpython-spresense-en_US-5.3.0.spk
Please press RESET button on target board
>>> Install files ...
install
Install build-spresense/firmware.spk
|0%-----------------------------50%------------------------------100%|
######################################################################

404096 bytes loaded.
Package validation is OK.
Saving package to "nuttx"
updater# >>> Save Configuration to FlashROM ...
set bootable M0P
M0P is not valid bootable. config not changed.
updater# sync
updater# Restarting the board ...
reboot



STEP3:Pythonコード "code.py" を CIRCUITPYドライブにコピー


このときに拡張ボードが必要です。USBケーブルを拡張ボード側に付け替えます。


2020-05-09.png


すると、CIRCUITPYというドライブが見えます。(SDカードは不要です)


2020-05-08 (3).png


次のPythonコードを"code.py"という名前で保存して、CIRCUITPYにコピーしたらLED0が光ります!

import board
import digitalio
import time

led = digitalio.DigitalInOut(board.LED0)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)



とっても簡単ですね!組み込みでPythonを試してみたいという方はやってみてはどうでしょう?
(^^)/~





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware







nice!(28)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE と BMI160アドオンボードで傾きを測ってみた!(1) [ロボット]

前回、SPRESENSEでモーターの回転数を測ってみました。今回は、スイッチサイエンスから出ている BMI160アドオンボードを使って、倒立振子の車体の傾きを検出してみたいと思います。


SPRESENSE用3軸加速度・3軸ジャイロ・気圧・温度センサ アドオンボード BMP280 BMI160搭載
https://www.switch-science.com/catalog/5258/


このボードはジャイロと加速度センサーが搭載されています。今回はそれぞれのセンサーで出力される値を比較してみたいと思います。加速度センサーとジャイロセンサーの座標軸は次のようになっています。


加速度センサーの座標軸

スライド1.png

ジャイロセンサーの座標軸

スライド2.png


ジャイロセンサーからは角加速度が出力されますので、角度は時間積分で求まります。

\[
\theta = \int_{0}^{t} \omega(t) \, dt
\]

加速度センサーで角度を出すには、重力を使います。重力加速度は常に下向きになりますので、角度は例えばZ成分とY成分のatan で求まります。プログラミング時は角度とラジアンの単位の違いに注意してください。

スライド3.png


あともう一点、注意しないといけないのは、置いた場所が水平とは限らないことです。何もしないと各軸への重力影響が取り除けず正しい角度が算出できません。開始時に各軸の重力加速度を計測をしておき、制御時はその影響を取り除く必要があります。(プログラム中では"Calibration"と呼んでいます)

これらのことを踏まえて、次のようなスケッチを書いてみました。

#include <Wire.h>
#include <math.h>
#include <BMI160Gen.>

#define BAUDRATE  115200
#define SENSE_RATE   200
#define GYRO_RANGE   250
#define ACCL_RANGE     2

#define COUNT_FOR_CALIB 1024

#define deg_to_rad(a) (a/180*M_PI)
#define rad_to_deg(a) (a/M_PI*180)

#define PRINT_ACCL
#define PRINT_GYRO
// #define PRINT_YAW

uint16_t adjust_usec;
static float calib_accel_x = 0, calib_accel_y = 0, calib_accel_z = 0;   

float convertRawGyro(int gRaw) 
{
  // ex) if the range is +/-500 deg/s: +/-32768/500 = +/-65.536 LSB/(deg/s)
  float lsb_omega = float(0x7FFF) / GYRO_RANGE;
  return gRaw / lsb_omega;  // deg/sec
}

float convertRawAccel(int aRaw) 
{
  // ex) if the range is +/-2g ; +/-32768/2 = +/-16384 LSB/g
  float lsb_g = float(0x7FFF) / ACCL_RANGE;
  return aRaw / lsb_g;
}

void print_pitch_roll() 
{

  static uint16_t n = 0;
  static float g_angle_roll = 0, g_angle_pitch = 0, g_angle_yaw = 0;
  static float a_angle_roll = 0, a_angle_pitch = 0, a_angle_yaw = 0;      
 
  static unsigned long last_mills = 0; 
  
  // read raw gyro measurements from device
  int rawRoll, rawPitch, rawYaw; // roll, pitch, yaw
  BMI160.readGyro(rawRoll, rawPitch, rawYaw);
  
  // read raw accl measurements from device
  int rawXAcc, rawYAcc, rawZAcc; // x, y, z
  BMI160.readAccelerometer(rawXAcc, rawYAcc, rawZAcc);

  unsigned long cur_mills = millis();
  unsigned long duration = cur_mills - last_mills;
  last_mills = cur_mills;
  float fduration = duration / 1000.0; // ms->s
  
  // convert the raw gyro data to degrees/second
  float omega_roll  = convertRawGyro(rawRoll);
  float omega_pitch = convertRawGyro(rawPitch);
  float omega_yaw   = convertRawGyro(rawYaw);
  
  g_angle_roll  += omega_roll  * fduration; // (ms->s) omega x time = degree
  g_angle_pitch += omega_pitch * fduration;
  g_angle_yaw   += omega_yaw   * fduration; // for the reference

  // convert the raw acclerometer data to m/s^2
  float cur_a_x = convertRawAccel(rawXAcc) - calib_accel_x;
  float cur_a_y = convertRawAccel(rawYAcc) - calib_accel_y;
  float cur_a_z = convertRawAccel(rawZAcc) - calib_accel_z;
  cur_a_x = deg_to_rad(cur_a_x);
  cur_a_y = deg_to_rad(cur_a_y);
  cur_a_z = deg_to_rad(cur_a_z);
  a_angle_roll = atan(cur_a_y / cur_a_z);
  a_angle_pitch = atan(-cur_a_x / cur_a_z);
  a_angle_roll = rad_to_deg(a_angle_roll);
  a_angle_pitch = rad_to_deg(a_angle_pitch);
  
   
#ifdef PRINT_GYRO 
  // Serial.print("Duration:");
  // Serial.print(duration);
  // Serial.print(",");
  Serial.print("GYRO_roll:");
  Serial.print(g_angle_roll);
  Serial.print(",");
  Serial.print("GYRO_pitch:");
  Serial.print(g_angle_pitch);
  Serial.print(",");
#ifdef PRINT_YAW
  Serial.print("GYRO_yaw:");
  Serial.print(g_angle_yaw);
  Serial.print(",");
#endif
#endif

  // display tab-separated accel x/y/z values
#ifdef PRINT_ACCL
  Serial.print("ACC_roll:");
  Serial.print(a_angle_roll);
  Serial.print(",");
  Serial.print("ACC_pitch:");
  Serial.print(a_angle_pitch);
#endif

  Serial.println();
  usleep(adjust_usec); // 2msec is the process time for displaying the values.
}


void setup() {
  Serial.begin(BAUDRATE);

  BMI160.begin(BMI160GenClass::I2C_MODE);

  BMI160.setGyroRate(SENSE_RATE);
  BMI160.setAccelerometerRate(SENSE_RATE);
  BMI160.setGyroRange(GYRO_RANGE);
  BMI160.setAccelerometerRange(ACCL_RANGE);

  BMI160.autoCalibrateGyroOffset();
  BMI160.autoCalibrateAccelerometerOffset(X_AXIS, 0);
  BMI160.autoCalibrateAccelerometerOffset(Y_AXIS, 0);
  BMI160.autoCalibrateAccelerometerOffset(Z_AXIS, 1);

  // Serial.println("Calibrating...");
  unsigned long sampling_rate = 1000 / SENSE_RATE;

  // Calcurate offset
  for (int i = 0; i < COUNT_FOR_CALIB; ++i) {
    int xAcc, yAcc, zAcc;
    BMI160.readAccelerometer(xAcc, yAcc, zAcc);
    calib_accel_x += convertRawAccel(xAcc);
    calib_accel_y += convertRawAccel(yAcc);
    calib_accel_z += convertRawAccel(zAcc)-1.0;
  }
  
  // mean value
  calib_accel_x /= COUNT_FOR_CALIB;
  calib_accel_y /= COUNT_FOR_CALIB;
  calib_accel_z /= COUNT_FOR_CALIB;
  
  calib_accel_z *= 1000; // The offset supports +/-495.3(mg)
  Serial.println("calib_a_x:" + String(calib_accel_x, 3));
  Serial.println("calib_a_y:" + String(calib_accel_y, 3));
  Serial.println("calib_a_z:" + String(calib_accel_z, 3));

  // SENSE_RATE is Hz and 2 millsec is the process time for this sketch
  adjust_usec = (1000/SENSE_RATE - 2) * 1000; 
  digitalWrite(LED0, HIGH);
}

void loop() {
  print_pitch_roll(); 
}



このスケッチで計測した結果がこちらです。


2020-05-07.png


ジャイロの変化は非常に滑らかなのに対し、加速度センサーはノイズが多いです。一方、ジャイロは"gyro_roll"の最後にオフセットがかかってしまっていますが、加速度センサーはその影響はなさそうです。(拡大して見ると"gyro_pitch"もオフセットを持ってしまっているようです)

どちらも一長一短ですね。この2つのセンサーの特長をうまく利用するために、次はフィルター処理を試してみたいと思います。😀
(^^)/~






SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



ROHM センサAdd-onボード SPRESENSE-SENSOR-EVK-701

ROHM センサAdd-onボード SPRESENSE-SENSOR-EVK-701

  • 出版社/メーカー: ローム(ROHM)
  • メディア: Tools & Hardware







nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

宇宙の場所で異なる物理定数をもつ宇宙は一体どうなるのか? [トンデモ学説]

私の愛読しているナゾロジーさんから、興味深い記事がリリースされていました。


space_constant.png
宇宙は場所によって物理定数が異なることが判明! 宇宙人はいないの?
https://nazology.net/archives/58281


宇宙の異なる場所では物理定数が異なるかも知れないというのは、結構前から議論されていたことでした。

物理定数は変化する?(日経サイエンス 2005年9月号)
http://www.nikkei-science.com/page/magazine/0509/invariable.html


今回は観測の結果、その可能性が高まったということのようです。

もし、これが本当ならどうなるでしょう?一番影響が出るのは光の速度です。高速の式を見直してみましょう。


\[
c = \frac {1} {\sqrt{\epsilon0\mu0}}
\]

ここで、ε0: 真空の誘電率、μ0: 真空の透磁率です。今回の観測で電磁気力の定数が異なることになりますので、これらの定数の値が異なることなります。

つまり、場所によって光の速度に違いがあるということです。その結果、何がおきるかというと、光の速度を前提とした相対性理論で導かれる結果が場所によって異なるため、電磁気力だけでなく、重力の作用も異なることになり、さらに時間の流れさえも異なることになります。

また、現在、遠い銀河までの距離をもとめるために前提としている赤方偏移もあてになりません。光の性質がそもそも異なるのですから。それだけでなく量子力学的なふるまいも全く異なるものになるでしょう。

その結果、宇宙の終末も、異なる場所では異なる終末を迎えるということになります。結局、我々が見ている遠くの銀河そのものが実は異なる宇宙に存在するものを見ているのと同義になります。


しかし、我々が見ている銀河は遠くのものも、馴染み深い形をしています。これは一体どういうことでしょう?


ここからはトンデモ理論になりますが、、、

今回の測定結果は定数の偏りに方向性があるように見えています。これは空間の広がりと関係しているように見えます。

ここで、もし宇宙がドーナツ状に外側に広がっていると考えると、ある地点から観測したドーナツの外側は空間が粗になり内側は密になるように見えます。


space_donuts.jpg


その結果、観測地点から外側の宇宙は、光速が見かけ上早くなり誘電率・透磁率が低くなるように見え、またその内側では光速が見かけ上遅くなり、結果的に誘電率・透磁率が高く計算される。

しかし、銀河レベルのミクロ?の状態では誘電率・span>透磁率は変わらないため、我々は遠くの銀河でもなじみの風景を見ることができるというわけです。さらにこのドーナッツは広がっているので、ビッグバン理論とも矛盾しません。

まぁ、単なる直観のでたらめな考えですが、こんな風に整えないと辻褄があわなさすぎるので勝手にこうなんだと納得するとします。😉





物理定数とは何か―自然を支配する普遍数のふしぎ (ブルーバックス)

物理定数とは何か―自然を支配する普遍数のふしぎ (ブルーバックス)

  • 作者: 西條 敏美
  • 出版社/メーカー: 講談社
  • 発売日: 2020/05/05
  • メディア: 新書



5次元宇宙の物理学

5次元宇宙の物理学

  • 作者: 五島 秀一
  • 出版社/メーカー: ヒカルランド
  • 発売日: 2019/03/11
  • メディア: 単行本



現代宇宙論―時空と物質の共進化

現代宇宙論―時空と物質の共進化

  • 作者: 松原 隆彦
  • 出版社/メーカー: 東京大学出版会
  • 発売日: 2010/06/23
  • メディア: 単行本




タグ:宇宙論 天文
nice!(24)  コメント(0) 
共通テーマ:趣味・カルチャー

「Maker Faire Kyoto Online」 が開催されます!! [徒然日記]

コロナの影響で展示会が見送りになった Maker Faire Kyoto 2020 ですが、5/2(土)の本日オンライン開催されます。皆さん知ってました?🙄


2020-05-02.png
「Maker Faire Kyoto Online」開催概要|5月2日(土)11:00-16:00まで誰でも参加できるTwitterを使った作品発表を開催します! #MFKyoto2020


参加方法は、Twitter で 「#MFKyoto2020」のハッシュタグを追加するだけ!お手軽ですね!
誰でも参加できるので、私も遠慮せず最近の作品をアップしたいと思います!


一応、投稿ルールがあって、自分の作品があてはまるカテゴリーの時間にツイートすることになっているようです。参加を考えている方、注意してくださいね。


タイムテーブル
・11:00:スタート(公式アカウントから開会のツイートを行います)
・11:00-11:30:「キッズ」「教育」カテゴリー
・11:30-12:00:「デザイン」「クラフト」「アート」カテゴリー
・12:00-12:30:「FAB」「アシスティブテクノロジー」カテゴリー
・12:30-13:30:「FOOD」(兼食事休憩、手作りランチの投稿も大歓迎!)
・13:30-14:00:「モビリティ」カテゴリー
・14:00-14:30:「ロボティクス」カテゴリー
・14:30-15:30:「エレクトロニクス」カテゴリー
・15:30-16:00:「ミュージック」カテゴリー ※ラストをぜひ盛り上げてください!
・16:00:終了(公式アカウントから終了のツイートを行います)



私は「エレクトロニクス」と「ミュージック」に参加かなぁ。できれば「ロボティクス」にも参加したかったですが、倒立振子が間に合いませんでした。

明日は初夏の陽気で暑いようですが、ツイッターもアツいですよ!Check it out!! 😉
( ゚ω^ )b





私たちはみなメイカーだ ―メイカーが変革する教育、仕事、社会、そして自分自身 (Make: Japan Books)

私たちはみなメイカーだ ―メイカーが変革する教育、仕事、社会、そして自分自身 (Make: Japan Books)

  • 出版社/メーカー: オライリージャパン
  • 発売日: 2017/08/12
  • メディア: 単行本(ソフトカバー)



Make: Electronics 第2版 ―作ってわかる電気と電子回路の基礎 (Make:PROJECTS)

Make: Electronics 第2版 ―作ってわかる電気と電子回路の基礎 (Make:PROJECTS)

  • 出版社/メーカー: オライリージャパン
  • 発売日: 2020/02/27
  • メディア: 単行本(ソフトカバー)



ティンカリングをはじめよう ―アート、サイエンス、テクノロジーの交差点で作って遊ぶ (Make:Japan Books)

ティンカリングをはじめよう ―アート、サイエンス、テクノロジーの交差点で作って遊ぶ (Make:Japan Books)

  • 出版社/メーカー: オライリージャパン
  • 発売日: 2015/06/24
  • メディア: 大型本





nice!(32)  コメント(2) 
共通テーマ:趣味・カルチャー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。