カテゴリー: 勉強

  • システム行動学 (Systems Ethology)とは一体なんなのか

    システム行動学 (Systems Ethology)とは一体なんなのか

    はじめに

    1998年にシステム生物学 (Systems Biology)が提唱されました。
    そして近年、次第にシステム生物学という概念が受け入れられてきているように感じます。

    システム生物学については、小林 徹也先生のシステム生物学って何だったんですか?という記事が非常にわかりやすくまとめてくださっています。

    間違っていることを言っていたら申し訳ないのですが、システム生物学では「生命をシステムとして理解する」というのがもっとも一言で表せることなのではないでしょうか。

    これは生物学全体、特に分子生物学や発生生物学、時間生物学など幅広い分野へ新たな視点を導入したという体感です。

    僕自身は神経行動学、ないしは行動学という学問の研究を行なっています。
    近年神経行動学の研究においても神経シミュレーションやコネクトームデータの解析、さらには動物の行動を解析するための機械学習ツールなど、動物をシステムとして捉えた計算論的な研究が広く発表されてきました。

    システム生物学が提唱された段階で、神経行動学のこういった影響を想定していたのか、現在こういった状況がシステム行動学のスコープの中に入っているのかというのは正直なところわかりません。

    ただ、こう言った流れが神経行動学の分野においても進んできているというのも事実であり、そう言った意味でシステム生物学の提唱は先見の眼があったと実感されます。

    システム行動学のはじまり

    システム生物学に現在の行動学の流れが入り込んできているのであればわざわざシステム行動学と名乗る必要はないではないかというのが一種疑問として上がってくると思います。

    いや、確かにそうなんだけど。。。と思うのですが、それでもあえてシステム行動学を提唱するに至った経緯があります。

    これは僕自身が思っていた願いが強いのですが、「行動学を研究する者たちが集まれる場が欲しい」という願いからです。

    行動学の研究は現在多様な視点で研究されてきており、神経行動学の学問の目標である、行動をどのようにして神経回路が制御しているのかという研究から、生態学の側面における行動が環境下でどのような機能を持つのか、進化生物学の側面における行動がどのように進化してきたのか、情報科学の側面における行動がどういう戦略でどう言ったシステムなのかなど、分野の垣根を超えて、行動というのもを研究してきています。

    また、神経行動学の中でもショウジョウバエやマウスなどのモデル生物を使った神経回路レベルの研究から、非モデル生物を使ったユニークな行動のメカニズムの研究まで幅広く、呼び名もNeuroethologyであったり、Behavioral neurobiologyであったりとします。

    これに拍車をかけるように、行動を調べるためのアプローチも多様化してきており、遺伝学を用いた神経活動操作から、電気生理やカルシウムイメージングによる神経活動記録、機械学習を用いた行動定量、数式による行動表現や強化学習による行動戦略の探索、より古典的に行動の詳細な観察などアプローチも垣根を超えてきています。

    そのため、自身の研究のスコープがもっとも近しい分野の学会に参加しているというのが個人の見解であり、どこかしらに、あれ?ホームの学会はどこなのだろう?という気持ちがありました。

    ただ、行動の研究はより多様化した視点で研究されてきており、特に研究手法については知りたいけど知れないと言ったようなことが起こり得るというのが現状です。
    非常に惜しい状況でありつつも、もしこれらが一堂に会する場所があれば行動学の研究により進化がお今るのではないか?と思いを馳せ、そう言った場を作ろうという意図がありました。

    これはあくまで僕自身の考えであり、一緒に協力してくださっている方々が同様のモチベーションであるとも、自分本位で成り立っているとも思いませんが、一堂に会する場が欲しいという意見は度々学会でいろんな人と話していました。

    そして、そう言った場を作ろうということで、システム行動学というものを提唱しようと画策しまし、2024年9月にSWARM2024

    Toward Understanding the Principles of Animal Behaviors: Systems Ethology
    Hayato M Yamanouchi, Yusuke Notomi, Ryoya Tanaka, Shumpei Hisamoto, Shigeto Dobata

    という論文を提出し、

    Systems Ethology: Toward Elucidating the Design Principles of Animal Behavior

    というOrganized sessionを行いました。

    SWARM2024のHPより、本OSの要旨を引用します。

    The exploration of biology plays a crucial role in elucidating the behavioral mechanisms of individual agents and their collective behavior as swarms, owing to the complex and diverse nature of animal behavior. In particular, recent remarkable advances in information processing technology have helped to elucidate their complex behavioral patterns. Furthermore, these technological innovations also enable detailed investigations into non-model species where established research tools are lacking, thereby contributing to a broader understanding of various biological phenomena. 
     Currently, methods for animal behavior analysis are highly diversified, necessitating opportunities for integrated discussions where specialists with cutting-edge knowledge can share their techniques. We therefore propose a framework called “Systems Ethology” to elucidate the design principles of animal behavior. With the overarching goal of understanding animal behavior as a system, we aim to facilitate the exchange of information regarding various approaches to elucidating the mechanisms underlying each behavior. Such cross-disciplinary interactions among researchers can assist in performing more efficient and meaningful research.
     In this session, we aim to gather biological insights from various disciplines such as ecology, ethology, and neuroscience. Additionally, proposals for diverse behavioral analysis approaches, incorporating insights from information science and engineering, are also encouraged.

    本OSではさまざまな視点で行動を研究されている研究者を呼ばさせていただき、非常に盛況なOSを企画することができました。

    現在はかねてからの願望であった、システム行動学研究会 なるものを行えないかというのを企画しています。

    システム行動学の考え方

    システム行動学とは一体なんなのか、どう言った学問として定義しているのかということについて、次に話していきたいと思います。

    行動学ではかつてニコティンバーゲンが提唱した、「ティンバーゲンの4つのなぜ」が中心となってきています。

    さまざまな言い方や考え方がありますが、ここでは、“survival value,” “ontogeny,” “evolution,” and “causation”の四つの観点とします。

    ニコティンバーゲンはこの四つの観点から行動を見る必要があると説き、現在の行動学、しいては神経行動学の重要な指針にもなっています。

    しかし、これらの観点は現在それぞれをフォーカスとした研究によって成り立っています。

    わかりやすい例だと、神経行動学では神経がどのように行動を制御しているのかをcausationの視点でフォーカスしていますし、生態学ではsurvival value、進化生物学では、evolutionを焦点に置いています。

    それぞれの疑問に答えることが重要ではありますが、これらの視点は別々に存在し、焦点の外のことに関してはブラックボックスとして扱われていました。

    つまり、行動のcausationsurvival valueを同時に焦点とし、両方のスコープを満たすような学問はこれまでないように感じます。(もちろん研究レベルで見れば現在はこれらを複合的に見る研究は多くなってきています。)

    行動を真に理解するには、“survival value,” “ontogeny,” “evolution,” and “causation”の四つの観点が必要であるのにも関わらず、なぜ統合されて来なかったかという点において、真相は誰にもわかりかねますが、一つの要因としてはお互いがお互いに理解し合うことが難しいということが挙げられると思います。

    逆に言えば、これを理解し合えるようにすればいいのでは?ということになります。
    そこで、システムという考え方を媒介にすることで、これらが解決できるのではないかと考えられます。

    つまり、システムがこれらをつなぐ、ある一種の言語のようなものになればお互いの考えを取り入れられるのではないか ということです。

    ここでは、システムを行動システム(Behaivora system)として定義しています。

    そもそも行動の考え方はたくさんあり、それ全てに適応することは難しいですが、ここではよりシンプルに、行動とは

    The internally coordinated responses (actions or inactions) of whole living organisms (individuals or groups) to internal and/or external stimuli, excluding responses that are more easily understood as developmental changes

    和訳:生物全体(個体または群れ)が内部および/または外部からの刺激に対して内部的に調整した反応(行動または不行動)であり、発達上の変化としてより容易に理解できる反応は除く。
    ~引用元 Levitis et al. (2009)~

    と定義しています。

    これをシステムに置き換えると、システムの出力が行動にあたります。
    そのため、入力と処理を担うシステム部分は行動システムとして扱います。

    行動システムには、個体を単位、神経細胞を単位、分子を単位と、各階層で見ることができます。
    この階層性の多様さがあり、行動ではこれを跨ぎつつ、複数階層で理解するというのが行動を理解するという上で必要になってくると思います。

    ただ、それだけ複雑になるということから、一つのシステムを完全に理解するというのを一つの研究で行うことは不可能になってきます。
    だからこそ、分野を問わず、さまざまなアプローチや知見を共有する場が必要であると思っています。

    あらためて「ティンバーゲンの4つのなぜ」に戻ってくると、システム行動学ではこの四つの疑問に答えるために、以下の四つの指針を挙げています。

    1) System structure: Static structure represented by nodes and edges. It includes discovering the behavior and the pathways by which the behavior is formed from inputs. It also elucidates the system’s components and how they are connected. 

    2) System dynamics: The dynamic structure is represented by nodes and edges. This perspective includes dynamics of the system (structure changes of the systems) and dynamics on the system (inner-statements transition of the nodes in the system). Dynamic system structure changes as a result of learning, development, and other parameters. 

    3) The control method: Methods for controlling the system’s states and behaviors. This method includes behavioral changes caused by intervention on the system’s nodes or edges. 

    4) The design method: Meaning and principles of the system. This method includes understanding the system’s adaptive and evolutionary significance. 

    ~引用元 Yamanouchi et al. SWARM2024, (2024)~

    これはつまり、システムのどういう面を解明していくのかという指針であり、これはシステム生物学の四つの指針を元にしています。

    システム行動学の今後というのは誰もはっきりとは確信を持っていないし、細かい部分に関してはまだ統一されていないというのが現状だと思います。

    だからこそ、今後行動学の今後を考えていく上で、システム行動学という場を作っていきたいと思っています。

    システム行動学の今後

    現状、システム行動学という新しい考え方を提案した状態であり、さらにはそれは学会のペーパーの状態です。

    いずれは論文のOpinitionなどといった形で世に公表していけたらと思っています。

    また、直近の願いとしては、元来の願いであった行動を研究する人たちが集まれる場を実現することです。

    まずは日本国内から、システム行動学研究会なるものを企画できたらと思っています。

    最後に

    本記事は作成者個人の考えであり、一意にシステム行動学というのを決定づけるものではありません。

    そのため、人によっては考え方が違うと言ったことや、間違っていることを言っているかも知れないことだけは留意していただけたらと思います。

  • 偏差値70超えの理系国立大学生が教える勉強術 ~ノートの取り方~

    偏差値70超えの理系国立大学生が教える勉強術 ~ノートの取り方~

    頭のいい人の勉強ノートって綺麗だとか、見やすいとか色々言われています。
    しかし、それを真似て授業でノートを綺麗に取ろうと思ってもただの板書の写しになったり、時間がかかったり、うまくいかないことが多いです。

    ノート作成で最も重要なのは、自分なりのノートの取り方を見つけ、身につけることです。
    ノート術について、僕のノートの取り方を参考にしながら、書いていきたいと思います。

    ノートの取り方のルール

    まず、ノートの取り方をいくら勉強しても、実用はできません。
    重要なのは、自分なりのノートのルールを決めることです。

    ルールの中で重要な点は以下の三つです。

    • なるべくシンプルでわかりやすいこと
    • 後で見返すタイプかその時に覚えるタイプか
    • 情報の分類方法

    なるべくシンプルでわかりやすいこと

    授業や講義などのノートやメモを取るような状況では、基本的に情報が流れていきます。
    そのような状況でもノートを取るためには、素早くノートに反映させることが重要になってきます。

    だからこそ、多種多様な色分けで綺麗に取るというよりは、情報の流れに追いつく必要があります。
    ノートを取る作業がメインではなく、情報を取り入れることがメインですから。

    なので、ルールはどれだっけというふうに考えるものではなく、直感的に色を選んだり、書き方を決めたりできるような方法でなければなりません。

    後で見返すタイプかその時に覚えるタイプか

    授業後、テスト勉強等でノートを活用すると思います。
    その際に、ノートを教科書のように使うのか、思い出す手がかりのようにして使うのかどちらのタイプによるかでノートに書く情報が変わってきます。

    教科書のように使うタイプでは、授業で出てきた情報などをなるべく多く書き込む必要があり、それだけ時間がかかります。
    しかし、勉強ではそれをメインの手がかりに勉強することができるので、後から勉強する上では非常に便利です。

    思い出す手がかりとして使うタイプでは、情報はある程度厳選するため、授業に集中することができます。
    問題は、後から勉強しようとした際に教科書など別の資料を参考にする必要が多いです。

    先生の授業スタイルや試験によっても異なると思いますが、主に自分がどちらのタイプなのかを決めておきましょう。

    授業でやったことを割と覚えていられるタイプは後者でいいと思います。
    何度もやらないと覚えられないという人は前者がいいかと思います。

    しかし、単純にノートが綺麗にとれるからとか、情報を漏らすのはなんか不安とかそういうのでは決めてはいけません。

    情報の分類方法

    ノートの中での色分けは実際には情報の分類分けになります。
    つまり、情報を分類分けすることによって、それに対応した色を決めるだけで色分けのルールを決定することができます。

    色分けを考える前に、どのような情報を自分は分類する必要があるのかを決める必要があります。
    具体的な僕の情報の分類の仕方は後述します。

    情報の分類の分け方として、重要な情報とそうでない情報。
    そして、その重要度に合わせてどれだけ分類するか。
    2段階なのか、3段階なのか、それ以上なのか。

    また、重要度の他には、見出し、先生の言ったこと、教科書に書いていないこと、補足情報などなど。

    例外が出てきた時に一旦記載する方法を決めておくと、どうしようか迷うことなくその場を乗り切り、その後ルールを洗練させていくことができます。

    これらの重要な点を踏まえた上でルールを決めていくと、自分なりの最強のノート術が完成します。

    僕のノートの取り方

    ここまで概念的な話をしてきましたが、実際に具体例として僕のノート術を上げていきたいと思います。

    まず、僕はその時に覚えるタイプなので、ノートは補足情報として考え、授業で情報を入れることに重きを置いています。
    ノートを書くのに時間をあまりかけたくないので、ルールは極端にシンプルにしています。

    情報の分類わけは、情報が重要か、重要でないかです。
    重要な情報は赤色で、そうでない情報は黒色で書きます。

    赤色で書く情報が多いので、赤色は消えるボールペン(フリクション)を使っています。

    もしかしたら重要かもなという情報であったり、書いた後で重要だとわかったことに関しては、赤ペンで下線をひきます。

    先生の言ったネタ的な情報は内容を思い出すのに重要なので、黒色で関連する情報の近くに小さく書いておきます。

    東大生のノート術といった本が出版され、綺麗にノートを取りましょうという内容が書かれていることが多いですが、それが合う人と合わない人がいます。

    僕自身はそれが合わず、
    (そもそも自分の字が綺麗じゃないので、あまりテスト勉強の時にノートを見返す癖がなく)
    かつ、多色だと迷うので、ノートはメモと割り切ることで自分なりのノート術を見つけることができました。

    たとえ綺麗にノートを取らなくても、勉強はできるようになります。

    万人にとって正解なノートの取り方というのはないので、色々試してみて、自分に合う、そして楽しいと思うノートの取り方を身につけましょう!!

  • 学振・特別研究員(DC1, DC2)申請書をもっとより良くするために [2024年度DC採択者経験談]

    2023年9月27日水曜日 14:00に学振 DC1, DC2の採択者の発表がなされました。

    僕も申請した学生の一人であり、無事採用内定を取得することができました。
    今年度の学振の採択率は例年よりも低いことがX (旧Twitter)で流れていました。

    採用内定は14%ほど、二次採用も含めると17%とのことでした。

    例年20%近くあると聞いていたので、採択率を見たときに「マジか・・・」と思いました。

    今回の学振ですが、いろいろな人の学振の申請書を見たり、自身の申請書を書いたりし、その中で申請書で少しでも採択率を上げるために気をつけるべきことをまとめてみます。

    学振のみならず、申請書、ES、など人に見せる文章を書くときにも参考にできると思うので、ぜひ読んでいってほしいです。

    気をつけるべき点は申請書のその先

    まず、申請書を書くうえで重要なことは、自分の言いたいことを限られたスペースで伝えることです。

    申請書とは、自身の研究を説明し、人に重要さを主張すること、私はどのような人で、どのようなことができるため、この目標を達成することができる。だからお金をください。

    と言うように、書いたその先に何があるのかを見越す必要があります。

    申請書を書いていると、いい文章を書くこと、先生に文句の言われない文章を書くこと、など目先のことにとらわれ、”申請書”と言うものの本質が頭から抜けてしまうことがあります。

    ただの自己満足ではなく、読み・評価する人がいて、それを元に採点されると言うことです。
    そこは明確にテストなどと異なり、だからこそ正解というものがありません。

    これまで、解答のあるテストなどを行ってきて、急に申請書にぶち当たると、一体何を書けばいいのか、何が正解なのかがわからなくなる人が多い印象でした。

    書いている最中も、申請書は誰のために書いているのかということを忘れずに、書く必要があります。
    そのために、学振前に幾つか別の機関の申請書を書いて、人に見てもらうということをしてもらっていると、それだけでかなり申請書の読みやすさが異なってきます。

    キーワードは”論理性”と”具体性”

    論理性

    僕が学振を書くときに最も気をつけたことは、論理性と具体性です。

    論理性とは、主張が一貫し、それぞれの話題がつながっていることです。
    つながりは、文同士、パラグラフ同士、申請書全体などさまざまなスケールで考える必要があります。

    もっと実感に基づいた言い方をすると、
    論理性のある文章とは、読み手が知りたい順に知りたい内容が記載されている文章です。
    これがしっかりできていると、読み手が読んでいるときにスッと内容が入ってきます。

    あくまで聞きて主観で考えるということ。
    自分がいかにこれは論理が通っていると言っても、相手にはその論理が通じないかもしれない。

    学振の書き方やテクニックなどで、「すなわち」「以下に詳細を述べる」などの文言を入れた方がいいということが書かれていますが、その本質は相手に文章のつながりを容易に理解してもらうためのガイドを示すということです。

    こう言った文言が必要か否かに関しては、人によって意見が大きく異なるところですが、言えることとしては、入れずに文章構造がわからなくなるのであれば、貴重な文字数を使ってでも入れるべきであるということです。

    具体性

    具体性とは、言葉通り、読み手が必要な分だけの情報が記載されているということです。

    よく申請書や研究発表で
    「私の研究は前提となる情報が多いから短くまとまらない〜」
    という言葉をよく聞いたことがあると思います。

    僕自信、10分の学会発表とかで、10分で終わるわけないやんとよく思ったものです。

    しかし、自信を持って内容を詰めた発表でも、聞き手にとってはいらない情報がたくさんあり、知りたい情報はほとんどなかったということがよくあります。

    つまり、内容の取捨選択ができていないのです。

    内容の取捨選択をする上で、自分自身が最も伝えたいことは何かを決めます。
    そして、その本質の説明に必要なものは残すこと、本質の理解にいらないものは捨てることで具体性を持たせることができます。

    学振などの申請書は本当に短い文章量で研究や自身のことを語る必要があります。
    よく学振でもらえるお金を申請書の文字数で割った金額を算出して、一文の価値を計算してみろ と言われます。

    この文章にはそれだけのお金の価値があるのか!ないなら変更するべきである。
    という観点を持ってほしいという意図でこの言葉を言っているのだと思います。

    研究の背景説明は第三者目線からの説明であり、自分の説明を際立たせるために必要ではあるが、その文自身は人の研究であるため価値は低いと言えます。
    最小限に収めるのか、別の価値を見出すのか、考え方はそれぞれだと思います。

    そうやって推敲し、内容が洗練させていきます。

    ここまで、具体性と書きながら、内容を削る話しかしてませんが、要は内容を詰め、一文の具体性を過不足なく高めていくということが重要になってきます。

    申請書はこの論理性と具体性を常に頭に入れつつ、時々立ち止まって読み直して、書き直すという作業をずっとやっていました。

    早めに人に見せること

    そして、申請書で最も重要な点の一つに、申請書を早めに人に見てもらうことというのがあります。

    一旦完成してから、自身が納得してから、と言って申請書締切1週間前になって見せてくる人がいますが、正直それは勿体無いです。

    人に見せるということは、自分自身が進んでいる方向性が正しいかどうかを確認すると同時に、意見をもらうということです。
    修正ではありません。

    学振をどれだけ人に見てもらったかで学振の出来が変わるとよく言われるように、新たな気づきや根本的な考え方などが変わったりします。

    理想は3週間前には担当教員以外の他の人に見てもらうのを目標にしましょう。

    申請書に向き合い続けない

    申請書を書く期間になると、実験も惜しんで申請書に向き合っている人をよく見ました。
    確かに、ある程度時間をかけなければならないものですし、何回も推敲を重ねるため、膨大な時間が必要になります。

    ただ、ある程度描き終わってからもただひたすらに申請書を読み返して、無意味に時間を過ごす必要はありません。
    むしろ、推敲前にはある程度時間を空けてから読む必要があります。

    申請書は人生がかかっている重要な書類です。
    しかし、かけた時間に比例してよくなるものではなく、いかに効率よく最善のものを作るのかという勝負です。

    パソコンに貼り付けにならず、ある程度実験を進めたり、なんなら気分転換をしながらかくと、冷静な視点で書くことができます。

    僕は大学だけではなく、パソコンをカフェとかに持って行って場所をよく変えながら書いていました。

    最後に

    本年度の内定採択率は一次選考地点で14%ほどと言われています。
    逆にいうと、申請した86%の人が学振に採択されなかったということです。

    採択されない人が大多数なので、そもそも採択されなかったことに必要以上に落ち込む必要はありません。

    また、学振に採択された人は、多くの人の夢や生活を押し除けて自分自身が採択されたということになります。
    それ相応の研究に対する評価はもちろん現状ではあるが、それ以上にこれから人一倍頑張るという責任が伴います。

    僕自身も戒めとして、今後も研究を頑張っていきたいです。

  • PWM出力を使ってパルス波の周波数, Duty比を変更する [Arduino UNO]

    PWM出力を使ってパルス波の周波数, Duty比を変更する [Arduino UNO]

    PWM出力とは

    PWMとはpulse width modulationの略で、パルス幅変調と日本語では言います。
    波長のデューティー比(Duty cycle)を変えることによって、変調を行う方法です。

    詳しくは前回の記事で説明されています。

    ArduinoのPWM出力

    Arduino UNOではATmega328と呼ばれるMicrochip社のマイコンをメインチップとして使っています。
    Arduinoのプログラムを考える上で、深みにハマっていくとマイコンのデータシートを見ていかなければならなくなりますので、一回見てみると面白いかと思います。(事実今がそう)

    Arduinoには三つのタイマー(Timer/Counter)があります。
    このタイマーはArduinoプログラムの時間に関係しています。
    delay()やtone()などの関数はこのタイマーを使って計測されています。

    Timer/CounterPin番号ビット数役割PWM周波数
    Timer05, 68 bitArduinoの時間を管理
    delay(), millis(), micros()など
    977 Hz
    Timer19, 1016 bitServoライブラリなど490 Hz
    TImer23, 118 bittone()など490 Hz

    今回このタイマーをいじることでPWMの出力を変えるということをします。
    ちなみに、応用するとタイマーの根本を変えるので、delay()などの関数もいい感じに変えたりすることができたりするかも?(どちらかというと影響を受けて狂ったりすることの方が多そう)

    TImer0は基本的にシステム全体に関わることが多いので、TImer1を使用することをお勧めします。

    参考になるサイト集
    https://playground.arduino.cc/Main/TimerPWMCheatsheet/
    https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
    https://atooshi-note.com/arduino-1hz-pwm/
    http://blog.kts.jp.net/arduino-pwm-change-freq/
    http://garretlab.web.fc2.com/arduino/inside/hardware/arduino/avr/cores/arduino/wiring_analog.c/analogWrite.html

    プログラムの概要

     プログラムの全体の方針として、Arduinoのタイマーをレジスタの設定を変えることで自由にPWM出力の周波数を変更することができるようにします。

    目的としては、低い周波数を出力できるようにしたく、10 Hzを出力できるようなプログラムにします。

    今回は10番ピンにLEDを繋いで、その光の周波数、Duty比を自由に変更できるようにするプログラムを作成します。
    10番ピンなので、TImer1を使用します。

    プログラムコード

    //レジスタの設定を変えるためのもの
    #include <avr/io.h>
    int PWMPin = 10;
    
    //関数の定義
    //frq:周波数 (1Hz~指定できる)
    //duty:指定したいduty比
    void HzWrite(int frq, float duty) { 
    
        // モード指定
      TCCR1A = 0b00100001;
      TCCR1B = 0b00010100; //分周比256を用いる
    
      // TOP値指定
      OCR1A = (unsigned int)(31250 / frq);
    
      // Duty比指定
      OCR1B = (unsigned int)(31250 / frq * duty);
    }
    
    
    void setup() {
      pinMode(PWMPin, OUTPUT);
    }
    
    void loop() {
      HzWrite(10, 0.5);
      delay(5000);
      digitalWrite(PWMPin, LOW);
      delay(5000);
    
    }

    プログラムの説明

    まず、レジスタの設定を変えるために、<avr/io.h>をインクルードします。

    #include <avr/io.h>

    次に、delay()と一緒に使って、10 Hzの出力を5秒ごとに繰り返すという関数を作るため、HzWriteという関数を指定します。カッコ内には周波数、Duty比を指定できるようにします。

    void HzWrite(int frq, float duty) { 
    
    }

    次にモードの指定です、。
    今回使うレジスタはTCCR1A/TCCR1Bです。(TCCR: Timer/Counter Control Register)
    ここで1というのはTImer1を示しており、Timer2を使いたければTCCR2A/TCCR2Bを使います。

    PWM周波数を〇〇Hzとして設定するには、TOP値を自分で指定する必要があります。
    TOP値が大きければ大きいほど出力される周波数は低くなります。
    今回は10 Hzで例を取っているので、16MHzというシステムクロックと比べると非常に遅いので、大きなTOP値と分周を指定する必要がある。よって、なるべく大きいTimer1を使用します。


    Timer0, 2の8 bitではTOP値の最大値は255(2^8 – 1)であり、Timer1の16 bitでは65535(2^16 – 1)となる
    (最大値が-1となるのは、0~255もしくは0~65535となるため、数字の数が2^xになるが、最大値は-1しなければならない。)

    システム的には、TOP値までカウンタをインクリメント(0, 1, 2, と数えていく)し、OCRxA/OCRxB(xはカウンタ番号、カウンタについて2つの出力ピンA, Bが割り当てられている。)と一致した時にピンの出力を変化させる(LOW→HIGHのように)。そして、カウンタがTOP値まで到達すると今度は0までデクリメント(65535, 65534, 65533と上から数えていく)し、インクリメントの時と同様にOCRxA/OCRxBと一致した時にピンの出力を変化させます。

    Arduino UNOではこのカウンタのインクリメントするスピードは分周比の設定を変えることによって、ある程度変えることができます。(ある程度とは、1/8/64/256/1024 の中から選択できるということ)
    分周比は周波数を分周(周波数を1/n倍すること)するときの比(n)です。
    つまり、1000 Hzを分周比10で分周すると100 Hzになります。

    ちなみに、分周比1ではArduino UNO(ATmega328)のシステム動作クロックである16MHzで操作します。

    つまり、TOP値とOCRxA/OCRxBの値、分周比を変えることによって、自由に出力の変換点を変えることができます。

    今回は10Hzを指定したいので余裕を持って分周比256で行います。
    1カウントする時間は、Unoなら16MHzなので1 / 16MHz = 62.5ns(分周1)
    分周比を256にすると、TOPまでカウントした際には62.5ns x 256 x 65535 = 1.04856 secなので、1 Hzを指定できるようになる。

    今回このプログラムでは1 Hz ~ 31250 Hzまでの周波数を作り出すことができる。
    しかし、31250に近づくにつれてDuty比の指定ができなくなっていきます。
    Duty比を細かく設定したい際には300 Hz程度までしか作成することができません。

    このプログラムでは分周比の設定を変更することで、自分の使用用途にあった周波数帯を作れるようなプログラムを作ることができます。

    TCCRaA/TCCR1Bには何を指定するのかを書きます。
    ここら辺の細かいところはなんか難しいので、データシートを使って、なんとなく指定していきましょう。

    今回は2進数で示しているので、最初に0bがついています。TCCR1AではCOM1A1, COM1A0, COM1B, 無指定, 無指定, WGM11, WGM10 を 1 か 0 で設定します。
    TCCR1B には それぞれ、無指定(ICNC1), 無指定(ICES1), 無指定, WGM13, WGM12, CS12, CS11, CS10 を設定します。

    TCCR1Aの指定(ATmega328データシートより)
    TCCR1Bの指定(ATmega328データシートより)

    まず、今回はModeはPWMモードがPhase Correct and Frequency Correct であるMode9を指定する。
    今回TOP値OCR1Aに指定する。

    モードの指定(ATmega328データシートより)

    よって、WGM13 / WGM12 / WGM11 / WGM10 はそれぞれ、1,0,0,1 

    出力の指定(ATmega328データシートより)

    COM1B0 / COM1B0 は 0, 0 が 無出力、0, 1 が トグル動作 (一致時の出力を反転)、
    1, 0 は カウンタ がOCR1A/B – TOP間 にある場合 LOW、0 – OCR1A/B間 は HIGH となるよう出力、
    1, 1 は1, 0 の逆です。

    今回は周波数をOUTPUTのLEDをLOWとHIGHで変えるため、1B0 / COM1B0 は1, 0の値を指定します。

    スケッチを書く際にわかりやすいので 1, 0 を選択します。

    分周比の指定(ATmega328データシートより)

    今回分周比は256を指定するため、CS12/CS11/CS10は1, 0, 0を指定する。

    まとめると、以下のようになる。

    TCCR1A = 0b00100001;
    TCCR1B = 0b00010010;

    次にOCR1AとOCR1Bを設定し、周波数とDuty比を指定したもので出力してもらうように指定します。

      // TOP値指定
      OCR1A = (unsigned int)(31250 / frq);
    
      // Duty比指定
      OCR1B = (unsigned int)(31250 / frq * duty);

    今回Phase and Frequency Correct PWMを用いる際には、インクリメントしディクリメントすることから、出力される周波数は以下のように示すことができます。

    周波数frq = IC の動作周波数 / (分周比 * TOP値 * 2)

    逆にTOP値を指定するときは

    TOP値 = IC の動作周波数 / (分周比 x frq x 2)

    今回Arduino UNOで分周比256とした際には

    TOP値 = OCR1A = 16,000,000 / (256 x frq x 2) = 31250 / frq

    LOWとHIGHが入れ替わるタイミングはOCR1A/OCR1B = Duty比としたいため、

    OCR1B = 31250 / frq x duty

    オーバーフローを防ぐため、Unsigned intを指定している。

    出力のメインはこちら

    void setup() {
      pinMode(PWMPin, OUTPUT);
    }
    
    void loop() {
      HzWrite(10, 0.5);
      delay(5000);
      digitalWrite(PWMPin, LOW);
      delay(5000);
    
    }

    PWMPinつまり10ピンをOUTPUTで指定し、HzWrite()で周波数とDuty比を指定する。
    delay()でまった後に、digitalWrite(PWMPin, LOW)で出力をなくし、delay()する。

    以上がプログラムの全貌と解説です。

    後書き

    PWM出力の周波数を変更する方法のブログに関して、Arduinoで検索するよりも、AVRとか、ATmega328, 328Pなどのように検索した方が多く出てきました。

    今回はざっくりとしたブログでしたが、より深く知りたい人は調べてみてください。

  • Arduionoで連続パルス波を作成する方法

    Arduionoで連続パルス波を作成する方法

    はじめに

    Arduinoを使って、連続パルス波を出力したりしたくなる時があると思います。
    LEDを点滅させたり、音を出力したり、タイマーとして使ってみたり・・・

    何かと使うことが多く、そして簡単なようにも思えますが、調べていくと非常に奥深いことがわかります。

    今回は、Arduinoで連続パルス波を出力する方法をいくつか紹介していきます。

    Delayを使って時間を変える

    最もシンプルかつ、簡単な方法で、delay関数を使って出力のONとOFFを切り替える手法です。

    //pinはピン番号
    void loop(){
        digitalWrite(pin, HIGH);
        delay(1000);
        digitalWrite(pin, LOW);
        delay(1000);
    }

    上記のプログラムでは、出力がHIGHとLOWとで切り替えています。
    delayは単位はmsなので、delay(1000)では1秒間待つというプログラムになります。

    つまり、1Hzでついたり消えたりするプログラムになります。

    ただ、周波数の指定にdelay()関数を使うことは問題点が多いです。
    また、この方法では、60Hzの信号を5秒間出力といったように、出力の時間を変更するのが、for構文を使って指定する必要があり、そういった面で不便さがあります。

    ただ、シンプルが故、とりあえずやってみたいという時にはおすすめです。

    tone()を使って指定する

    tone()関数はブザー音などを作成するときによく使われる関数です。
    Arduino公式の解説

    この関数では、周波数、継続時間を指定することができます。
    なので、delayを使った時とは違い、周波数を計算せずとも直接指定することができます。

    //pinはピン番号
    void loop() {
         tone(pin,60);
    }

    tone(pin, frequency)や、tone(pin, frequency, duration) といったように指定することができます。

    durationはms単位で指定するため、delayと同様の記載方です。

    この関数の問題は、指定できる周波数が31Hz以下ではできないという点です。
    つまり、1Hzなどの出力を作ることができません。

    音などの31Hzより大きい周波数を指定する時には非常に簡単に周波数を指定できますし、delay関数を使う時よりも非常に短く、正く指定することができます。

    PWM出力を使って、PWM出力の周波数を変える

    PWM出力を使う方法は最も自由度が高く、そして奥深すぎる原因です。

    PWMとはpulse width modulationの略であり、日本語ではパルス幅変調です。
    詳しくはwikipediaより

    この言葉だけ聞いてもなんのことかよくわかりませんが、簡単にいうと、PWMとはデューティー(Duty)比を変更して色々変調する方法です。
    Arduino公式の説明はこちらから

    LEDの明るさを指定するときに、本来であれば電流値を変えることで明るくしたり、暗くしたりできます。
    しかし、電流値が一定だった時に、でもLEDの明るさを変えたいとなった際に、めっちゃ早い周波数で(人が点滅しているのがわからなくなるのが30~60Hzと呼ばれている)点滅させます。

    そして、ONとOFFが通常であれば1:1(Duty比が50%)となっていますが、これを4:1(Duty比が80%)とか1:4(Duty比が20%)とかにしてみるとどうでしょうか。
    前者では明るく見え、後者では暗く見えるでしょう。

    このようにして、パルスの幅を変えることで出力を変調するというのがPWMによる出力です。

    そして、Arduinoではこの出力ができるとともに、PWM出力の周波数を変えることもできます。
    レジスタ設定と呼ばれる、まあArduinoの元の部分を変えちゃえばPWMの出力周波数を変えることができるっしょっていう考えがこの方法です。
    ちなみにデフォルトでは出力周波数は490Hz、一部のピンでは980Hzです。

    今後の記事でやり方を詳しく説明します。
    「PWM Arduino 周波数 変更」で調べるとたくさん説明が出てきます。

    4回ぐらい読むとなんとなくわかるようになると思います。

    基本的にはこれらの方法で自分の目的にあったプログラムを探してみてはどうでしょうか。

  • ファイルのバージョン管理をするための最強ツール”Git” 初心者向け解説

    ファイルのバージョン管理をするための最強ツール”Git” 初心者向け解説

    Gitとは

    皆さんGitよりもGitHubを先に知っているのではないでしょうか。
    参考にするプログラムや、ソフトを探すときに、よくGitHubのサイトがヒットし、よく使い方がわからないまま、とりあえずダウンロードしたという経験がある人も多いのではないのでしょうか。

    ただ、GitHubはプログラムの共有の場所ではあるが、ただの共有する場所ではなく、Gitとよばれるツールをオンラインで使うためのツールです。

    Gitとは、ファイルのバージョン管理を行うためのツールです。
    ファイルを変更し、その変更を記録することによって、いつでも記録した任意のバージョンへと戻ることができるツールです。

    発表原稿とかを誰かに添削してもらう際に、添削する前のファイル、添削し終わったファイル、添削をもとに修正したファイルなどをそれぞれ別のファイルとして保存すると思います。
    そのような変更をGitと呼ばれるツールを使うことによって、簡単に、そして一つのファイルで行うことができます。

    Gitのリンクはちらから

    Gitの三つの場所

    Gitを使った記録、およびその記録をするという操作を“コミット”と呼びます。

    そして、コミットを貯めていく場所を“レポジトリ”と呼びます。
    つまり、レポジトリは変更履歴を補完する場所とも言えます。
    リポジトリの保管庫は自分のパソコン上では“ローカルレポジトリ”GitHubなどのリモート上では“リモートレポジトリ”と呼びます。

    Gitでファイル管理を行おうとする際には、Gitでファイル管理を行うフォルダーを指定します。
    そしてそのフォルダ内には三つの場所があります。
    ワークツリー、ステージングエリア、Gitディレクトリです。

    ワークツリーはファイルを保持する場所であり、ここにあるファイルを変更しただけではまだ変更履歴をコミットとして保存できていません。

    ステージングエリアはコミットするファイルを登録するための場所です。
    個々のステージにあるファイルも同様に、まだ変更履歴は保存されていませんが、このファイルをコミットしますという宣言をする場所と思ってください。

    Gitディレクトリはコミットを保管する場所です。
    ここにコミットされたファイルは変更されることはないファイルとして格納されます。
    コミットによって記録された内容は、基本的にはあとから変更、消去することができないです。
    Gitディレクトリにコミットされることによって、変更履歴として記録されたこととなります。

    Gitの基礎的な使い方

    詳しい使い方は実際に調べていただくとして、ここでは実際の操作の大まかな説明をします。

    Gitは基本的には、WindowsではGit Bash(Gitをインストールしたときに一緒にインストールされる)、macOS. Linuxではターミナルを使って操作します。(ここでは両行ターミナルと呼びます。)

    皆さんが使い慣れているであろうGUIでの操作もありますが、慣れるとCUIでのGitの利用は非常に便利なので、最初からCUIを使うことをお勧めします。
    1時間で慣れると思います。

    まず、Gitで管理を始めるために、ローカルリポジトリを作成します。
    初めに、Gitで管理したいディレクトリに、ターミナル上で移動します。
    そして、

    git init

    と入力することによって、Gitでのバージョン管理をする準備ができます。

    次に、ステージングエリアに変更を記録するために、

    git add ファイルパスもしくはディレクトリパス

    を実行することで、ワークツリーの指定したファイルをステージングエリアに登録します。

    次に、

    git commit

    でワークツリー内のファイルをコミットします。

    今現在、どのファイルがどの状態であるかを確認するには

    git status

    を実行します。
    コミット履歴は

    git log

    を実行することで確認することができます。

    基本的には、git addして、git commitをすることで変更履歴を作成し、git satusで困ったときに状態を確認するという流れになります。

    下は参考文献です。
    初心者にも非常にわかりやすい本であり、こちらの記事の執筆の参考にもさせていただいています。
    より詳しく勉強したいという方はこちらの本をおすすめします。

  • ITパスポート試験とは?勉強時間は?なにに使える?

    ITパスポート試験とは?勉強時間は?なにに使える?

    先日ITパスポート試験試験を受けてきました。
    最近知名度を上げてきているITパスポート試験ですが、いったいどんな資格で、どれぐらいの難易度だったのでしょうか。
    実際に経験談をもとに説明していきます。

    まず、まとめとして、
    ITパスポート試験はITに関する知識の検定試験であるということ。
    勉強時間は大体30時間ほどどれだけ短くても10時間以上

    まず、ITパスポートの資格は国家資格であり、
    IT、経営全般に関して基礎的な知識があることを示す資格です。

    なので、免許ではなく、僕としては検定に近いような印象でした。
    テスト内容も、プログラミングのことというよりは、ITに関する技術、そして、企業の経営戦略やマネジメントに関連する総合的な知識が出題されます。

    この資格を取ることによるメリットは、
    ・就職活動のアピールポイントとなること
    ・ITの知識があることの証明となること

    が挙げられます。

    資格を取ることをおすすめする人として、
    大学生、新入社員が主に上げられます。
    就活が不安な人などはこの資格を取ってみてはどうでしょうか。

    次に、試験について。
    僕自身受けてみて、資格の難易度はアマチュア無線4級を取った時とおなじような難易度だなと感じました。
    はっきり言って、思っていた以上に難しかったです。

    勉強時間は大体30時間あれば安定して合格できると思います。
    そして、僕自身は8時間ぐらいでしたが、ぎりぎり合格かな?という具合でした。

    内容の把握は比較的しやすく、なじみのある話題が多いのですが、実際の用語が非常に覚えにくく、アルファベット三文字とか、複雑な用語が非常に多かったです。

    最短で合格を目指す勉強法として、
    絶対に満点を取ろうとしてはいけないということです。
    合格点の600点(1000点満点)のちょい上を目指しましょう。

    その理由として、試験の時には勉強していない問題が必ず出ます。
    また、理解が難しい問題も多く出ます。

    過去問がホームページに公開されているので、直近数年分といてみるとわかると思いますが
    勉強してないよ!難しすぎるよ!
    という内容が意外にも多いかと思います。

    わからない問題があった時に、完璧に理解したいとか、解けるようになりたいと思う人が多くいると思いますが、最短で合格したい人はそこは潔くこういうものだとさらっと流しましょう。

    アルファベットの略語も覚えにくいですが、それぞれの言葉の意味を完璧に辞書のように覚えるのではなく、キーワードを絞り、何となく覚えるをめざしましょう。

    資格として、それでいいのかという意見がありますが、僕個人の意見として、辞書のように用語を覚えている必要は全くないと思います。
    実際にその用語にあった時に、何となく意味が分かるとか、そういう考え方があるということを知っていることが重要であると思います。

    何となく覚える!が合格への最短ルートです。

    おすすめの勉強法として、

    • 一度参考書を最初から最後まで読む(わからなくても最後まで読みましょう)
    • 過去問を4年ぐらい前から現代にかけて解いていく
    • 間違えた問題や、わからなかった問題を参考書をもとに理解する(参考書になければさらっと流す)
    • よく間違えた単語と意味をメモし、テスト直前にそれを読み返す

    テストの攻略は過去問を解くこと!
    それに尽きます。

    難易度が高い資格ではないです。
    しっかり対策すれば絶対に合格を取ることができます。

    ぜひ挑戦してみてください。

    ITパスポートのホームページはこちらから
    僕が勉強に使った本はこちら