HOME

こんにちは、私は工学系の現役国立大学院生をやってます。

 

このブログは私の知識の備忘録として活用していきます。

 

研究でちょっとした装置開発を行う機会があるので、そこで得た内容や更に勉強した内容、全く関係なく知識として取り入れたい内容などを書いていこうと思います。

 

 もし読んでいただいた中で参考になるものがあれば幸いです。

 

 

プログラムの主な使用言語

C マイコン制御で使用

C++ 同じくマイコン制御で使用

Python データ処理等で使用

Dart  アプリ開発用として使用

(やっていることは本当にたいしたことないです。。。)

 

 

興味・関心

マイコンを使用した開発が好きです。CやC++でちょっとしたコードを書いて装置開発をし、それを使用して研究活動で活かすことをしてきました。また最近はアプリ開発に興味があります。

趣味は映画・漫画・服・テニス・料理など多岐にわたります。他にも釣りやゴルフなど友人から誘われればなんでもやります。

 

以下にブログコンテンツについて簡単に記載します。

 電子工作

マイコンの設定や各通信方式の実装方法など

iOSアプリ開発・Flutter

 XcodeやFlutterをちょこっと触ってみたのでちょこちょこ書いていこうかと思います

お金

投資など

旅行

行った場所とかかった料金について

 

ベトナム旅行 各費用(2020年2月)

こんにちは。

私は現在大学4年生です。

そろそろ大学も卒業ということで友人とベトナムへの海外卒業旅行を計画しています。

そこでベトナム旅行がいくらかかるのかをまとめておきたいと思います。

先に言うと合計は11万6000円となりました。

 

飛行機代

海外旅行において飛行機の料金が大部分を占めてしまうことが考えられます。

飛行機の予約をしたのが2020/1/10、出発日時が2020/02/22で約1か月前と直前となってしまいました。

そこでかかった代金が手数料込みで57800円でした。

行先は羽田空港からホーチミン

ベトナム内の国内線で無人島へ行く計画にするともう1万円かかる予定でしたが高かったためやめました。

 

宿代

 

 宿は貸別荘を借りることにしました。

宿はプール付きの少しいい所を借りましたが、友人7人との旅行であったため一人当たり約4200円程度でした。

 

 

 

アクティビティ

メコン川クルーズのツアーに申し込んだので4000円かかりました。

 

 

 

現地での費用

現地で何にいくら使ったか覚えていませんが、合計で5万円両替しました。

カジノで1万円分使用したり、マッサージに行ったりと大豪遊したため結構かかりましたが、普通に旅行したとすると両替は2~3万あれば十分のように感じました。

 

移動は全てタクシーを使用しましたが、ホーチミン市内の移動であれば約100~200円程度で移動できます。

 

市場でTシャツを買ったりしましたが、これも上手に値切ればもっと節約できたと思います。

 

 

 

したがって合計は約11万6000円となりました。

もう少し節約すると8万とかで十分遊べるかとは思います。

 

ベトナムに行ってみて思ったことは

・とにかく交通量が多いので道路を横断するのが怖い。

・物価が低いのでごはんを好きなだけ頼める。

・外で金を出していると、小さい子にパパと呼ばれついてこられるのが怖い。

・市場だと日本語を喋れる人が以外と多い。(基本英語でやりとり)

です。

 

 

【IOSアプリ開発:xcode】カウントアップアプリ開発

今回はボタンとテキストを使用したカウントアップアプリを作成しました。

単純にボタンをタップしたらテキストに表示されている数字が1ずつ増えていくだけのアプリです。

 

 

完成品が以下の写真の通りになっています。

f:id:yokoblog_b:20200213180230p:plain

 

では実際に解説してきます。

 

 

 

 

1)Main.storyboard

ボタンとLabelを配置するだけです。

f:id:yokoblog_b:20200213180631p:plain

 

あとはそれぞれ右クリックからのドラッグ&ドロップでViewControllerに関連づける作業をします。

 

 

最後に、ボタンをクリックされた時の処理をするため、ボタンのUIを右クリックして”Touch up inside”をコードにドラッグ&ドロップします。これによりボタンがタップされた時に呼び出される関数が作成されるので記述していきます。

 

 

2)ViewController.swift

コードを載せます。

import UIKit

 

class ViewController: UIViewController {

    

    @IBOutlet weak var tapbutton: UIButton!

    @IBOutlet weak var countlabel: UILabel!

    

    var count:Int = 0

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view.

    }

 

    @IBAction func buttontapped(_ sender: Any) {

        count += 1

        countlabel.text = String(count)

    }

    

 

}

下にある関数のbuttontappedはボタンがタップされた時に呼ばれる関数です。

この中に変数"count"をプラス1してLabelに表示すれば完成となります。

countはInt型ですが、表示する場合にはString型として表示します。(正しいのかはわからないが)

 

【IOSアプリ開発:xcode】UITableViewを使用する

今回はTableViewを使用します。

TableViewとは下に示した図のように用意した文章などをそれぞれの行に並べて示すことができるものです。

 

f:id:yokoblog_b:20200212214841p:plain

 

 

では早速説明していきます。

 

 

1)Main.storyboard

まず初めにmain.storyboardを編集します。

object選択画面からTable Viewを選択し、画面にドラッグ&ドロップします。

そして全画面に表示されるように引き伸ばします。(別に引き伸ばさなくても良いが)

 

f:id:yokoblog_b:20200212215727p:plain

 

 

その後、Table View CellをTable Viewの中に入るようにドラッグ&ドロップすることで次の画面のようになります。

正しく出来ていれば左のような構図になります。

f:id:yokoblog_b:20200212221001p:plain

 

Objectの設置はここまでで終了です。

次の作業として、設置したObjectをView Controllerと関連付けます。

このための作業として、Table Viewの上で右クリックし、画像のように黒いタブが出てきますので、"dataSource"と"delegate"の◯とスマホ画面の上にある黄色いView Controllerをそれぞれつなげます。

f:id:yokoblog_b:20200212222539p:plain

 

 最後にTable View Cellにタグ付け?みたいなことをしておきます。

Table View Cellを選択した時のidentiferに"tableCell"と名前をつけておきます。

この名前は自分でわかりやすい名前に変更しても構いません。

これであとはプログラムを書くだけになります。

f:id:yokoblog_b:20200212223908p:plain

 

 

 

 

2)ViewController.swift 

 まず今回記述したプログラムを示しておきます。

import UIKit

 

class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

    

 

    var Countrylist = ["日本","アメリカ","ロシア"]

 

    override func viewDidLoad() {

        super.viewDidLoad()

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }

    

    //テーブルの行数を指定するメソッド

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return Countrylist.count

    }

    

    //セルの中身を設定するメソッド

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        //セルを取得

        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

        

        //セルに値を設定

        cell.textLabel!.text = Countrylist[indexPath.row]

        return cell

    }

 

}

 

 

では説明します。

1:まずTable ViewのDatasourceとDelegateを使用するためにクラスに継承させます。

class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate

 

2:Table View Cellに表示させる項目についての配列を作成する

var Countrylist = ["日本","アメリカ","ロシア"] 

 

3:テーブルの行数を指定するメソッド

今回はCountrylistの項目の数を返しています。

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return Countrylist.count

    }

 

4:セルの中身を設定するメソッド

//セルの中身を設定するメソッド

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        //セルを取得

        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

        

        //セルに値を設定

        cell.textLabel!.text = Countrylist[indexPath.row]

        return cell

    }

 

 

 

以上の設定により実行することで最初に示した画面のようにCoutrylistの項目がTableに表示されるようになります。

【IOSアプリ開発:xcode】テキスト表示

今回はIOSアプリ開発の基礎としてLabelを設定してテキストを表示するところまでについて書く。

 

まずxcodeを開く。

今回はswiftUIではなくstoryboardを使用する。

 

 

・Main.storyboardはtextを配置したりするもの

・ViewController.swiftはプログラムの記述をするもの

 

 

開発前にこの画像の右にある+のようなマークを押し、storyboardとswiftファイルを両方表示しておくと開発しやすい。

f:id:yokoblog_b:20200210182628j:plain

 

 

 

 

さて実際にstoryboardにlabelを配置していく。

まず右上のプラスボタンによりlabelを適当ないちに配置する。

文字の大きさや色は右に表示される欄から設定する。

この時点では"Label"と表示されているが、これは自分がわかりやすいように変更しても良い。(ボタンと関連しているテキストならButton1など)

実行して実際にiphone画面に表示されるテキストは後で設定するものになる。

 

 

このlabelを右クリック+ドラッグでswiftファイルのclass内へ。

f:id:yokoblog_b:20200210184506j:plain

 

この時わかりやすい名前にしておく

今回はテキストを2つ表示するということでtext1とtext2にした。

 

また下の関数内にtext1.text = ""

のように記述し、""の中に文字列を入れることでその文字が表示される。

 

ARMマイコンのSDカード通信のSDK(fatfs_example)をSDHCに対応させる

使用エディタ:Embedded studio for ARM

SDK:15.0.0

 

SDHCに対応させるには適切な順序でコマンド送信をする必要がある。

SDK内の"app_sdcard.c"というソースコードを使用することでSDカードとの通信をすることは可能ではあるが、このままではSDHCには対応していない。

そこでSDHCを使用する際にどのように変更すれば良いのかを書いておく。

 

"app_sdcard.c"内のどれを変更すれば良いかというと、

 

PT_THREAD(sdc_pt_identification(uint8_t * p_rx_data,uint8_t rx_length,
                     sdc_result_t * p_exit_code))

 

というやつです。

では順番に何を書けば良いのか説明します。

 

1)SDHCカードとSPI通信をするための設定

・ピン定義と周波数設定等

 

2)SPI通信を400kHz以下にする

そのため最初のPT_BEGINの前に以下のものを記述することで始まる前に周波数を変更します。

 

 nrf_drv_spi_xfer_desc_t xfer = NRF_DRV_SPI_XFER_TRX(0xFF,8,0,0);
nrf_delay_ms(1);
SPI_frequency_set();//spi speed under 400kHz(250)

 

3)74ダミークロックを送信する

while(1)が始まったらすぐに以下のものを記述する

送信するxferは上の段階で設定されている。

 

//74(80) dummy clock
for(int i= 0; i > 11;i++){
ret_code_t ret = nrf_drv_spi_xfer(p_spi,&xfer,NRF_DRV_SPI_FLAG_REPEATED_XFER);
}

 

 

 

 

 

 

多分これで動くと思うが、書き漏れがあるかもしれないので他のサイトも確認してみてください。

最後のPT_ENDの前で周波数を再設定することも忘れずに!

ARMマイコン(nRF52832)でのSPI通信プログラム

今回はARMマイコンでSPI通信をしました。

 

エディタはEmbedded studio for ARM v4.16。

SDK15.0.0を使用。

SPI通信に必要な事項について書いておきます。

今回私はSDカードとのSPI通信をしたので単純にSPI通信をするにあたって必要のないものも含まれているかもしれません。

 -------------------------------------------------------------------------------------------------------------

1)includeファイル

・(ffとかgpioとか必要ないかも?)

・これらはインクルードパスを通さないといけない

 インクルードパスとは、これらのヘッダファイルがパソコン内のどこにあるかをエディタに定義しておくこと

 

#include "nrf_block_dev_sdc.h"
#include "ff.h"
#include "diskio_blkdev.h"
#include "nrf_gpio.h"
#include "nrf_drv_spi.h"
#include "nrf_assert.h"
#include "pt.h"
#include "nrf_pt.h"

 --------------------------------------------------------------------------------------------------------------

2)ピン定義

・使用するものによって変数名、数値(SPIが対応しているピン番号)を変更する

 

#define SCK_PIN  1   //sensor serial clock (SCK) pin.
#define MOSI_PIN   2   //sensor serial clock (MOSI) pin.
#define MISO_PIN   3  //sensor serial clock (MISO) pin.
#define CS_PIN    4   //sensor serial clock (CS) pin.

--------------------------------------------------------------------------------------------------------------

3)SPIスタート条件定義

・SPIのスタート条件として、CSをHIGHからLOWにする

#include "nrf_gpio.h"が必要

 

void SPI_start()
{
  nrf_gpio_cfg_output(sensor_CS_PIN);  //CSpinのgpio設定
  nrf_gpio_pin_set(sensor_CS_PIN);    //CSをHIGH
  nrf_gpio_pin_clear(sensor_CS_PIN);   //CSをLOW
}

--------------------------------------------------------------------------------------------------------------

4)SPIインスタンス生成

・SPIを使用するにあたってインスタンスが必要となる。

・複数のSPI通信をするにもインスタンスの設定をすることで差別化を図ることができる。

・これをするまえに"sdk_config.h"でもインスタンスを有効にする必要がある。

・これを記述することで"spi"をインスタンス1として設定する。 

 

#define SPI_INSTANCE 1;
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE);//SPI_INSTANCE (spi1)
const nrf_drv_spi_t *p_spi = &spi;
static volatile bool spi_xfer_done; 

--------------------------------------------------------------------------------------------------------------

5)イベントハンドラ

・spi通信の状況(イベント)によって異なる処理をするためのもの

・今回のはSPIイベントが終わったらFlagをtrueにするといった処理

・これにより「SPI通信→(終わったら)ほかの処理」のようなものができる

 

volatile static bool spi_tx_done = false;
void nrf_drv_mpu_spi_event_handler(const nrf_drv_spi_evt_t *evt, void * p_context)
{
  if(evt->type == NRF_DRV_SPI_EVENT_DONE)
{
  spi_tx_done = true;
}else
 {
  // Something is wrong
 }
}

--------------------------------------------------------------------------------------------------------------

6)SPI初期化

・ピンなどの設定として初期化する必要がある

・SPIの周波数、MODE、ビットオーダー等の設定ができる

https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk51.v10.0.0/structnrf__drv__spi__config__t.html

 

void SPI_INIT()
{
  uint32_t err_code;

  nrf_drv_spi_config_t config = {
    .sck_pin = SCK_PIN,
    .mosi_pin = MOSI_PIN,
    .miso_pin = MISO_PIN,
    .ss_pin = CS_PIN,
    .frequency = NRF_DRV_SPI_FREQ_1M,
    .mode = NRF_DRV_SPI_MODE_0,
    .bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST
  };
  err_code = nrf_drv_spi_init(&spi,&config,nrf_drv_mpu_spi_event_handler,NULL);

}

--------------------------------------------------------------------------------------------------------------

7)あるアドレス(0x6Bなど)に値(0x80など)を送信する方法

・まずdefineでアドレス定義

・アドレスと値を定義

・nrf_drv_spi_transferで送信

 

#define PWR_MGMT_1 0x6B

uint8_t reg_chipreset[2] = {PWR_MGMT_1,0x80};
nrf_drv_spi_transfer(&spi,reg_chipreset,sizeof(reg_chipreset),NULL,0);//chip reset

--------------------------------------------------------------------------------------------------------------

8)センサとのSPI通信などで、データを受け取るために送受信する方法

・まずセンサの読むためのアドレス(スレーブアドレス?)?を定義

・値を受け取る配列も定義

nrf_drv_spi_xfer_descのように設定することでアドレスに1バイト送信することで21バイトのデータが配列に入る

 

#define read_six_axis 0xBB//read data

uint8_t reg_six = read_six_axis;
uint8_t mpu_buf[25] = {0};

 

nrf_drv_spi_xfer_desc_t xfer_spi = NRF_DRV_SPI_XFER_TRX(&reg_six,1,mpu_buf,21);

 

・続いてフラグ設定(それぞれの意味は要検索)

uint32_t flags = NRF_DRV_SPI_FLAG_HOLD_XFER |
       NRF_DRV_SPI_FLAG_RX_POSTINC |
       NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER |
       NRF_DRV_SPI_FLAG_REPEATED_XFER;

--------------------------------------------------------------------------------------------------------------

9)main関数での呼び出し

・これらの定義をしたらmain関数内で呼び出す

int main(){

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  SPI_start();//スタート条件

  SPI_INIT();//SPI初期化

 

  //設定したフラグ通りに送信

  ret_code_t ret = nrf_drv_spi_xfer(&spi,&xfer_spi,flags);

  

  //SUCCESSだったらspiの通信をする

  //多分ここでセンサのデータを受け取っている?
  if(ret == NRF_SUCCESS)
  {
    uint32_t start_tsk_addr = nrf_drv_spi_start_task_get(&spi);
  }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//センサのデータ処理など

}