<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>組み込みソフトウェア - 鬱リーマン、不毛な日々と時々デイトレ</title>
	<atom:link href="https://initial-jj.com/entry/category/pc_and_software/embedded_software/feed/" rel="self" type="application/rss+xml" />
	<link>https://initial-jj.com</link>
	<description>月初50万スタートデイトレは数を撃たないスキャルパー。投資以外の事も綴っています。ノーマル専のパチスロカス。LOVEリーチ目。</description>
	<lastBuildDate>Thu, 14 Jul 2022 03:10:11 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://initial-jj.com/wp-content/uploads/2021/06/cropped-xanaduアイコン-32x32.jpg</url>
	<title>組み込みソフトウェア - 鬱リーマン、不毛な日々と時々デイトレ</title>
	<link>https://initial-jj.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">194931865</site>	<item>
		<title>絶対にわかる組み込みソフトウェア 8: 4桁7セグLEDダイナミック点灯～ソースコード公開～</title>
		<link>https://initial-jj.com/entry/2021/0214/howto_embedded/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=2021-0214-howto_embedded</link>
					<comments>https://initial-jj.com/entry/2021/0214/howto_embedded/#respond</comments>
		
		<dc:creator><![CDATA[Initial_JJ]]></dc:creator>
		<pubDate>Sun, 14 Feb 2021 07:30:00 +0000</pubDate>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ＰＣ・ソフトウェア]]></category>
		<guid isPermaLink="false">https://initial-jj.com/entry/2021-0214-howto_embedded/</guid>

					<description><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使った、組み込みソフトウェアを理解する入門シリーズ第８回。 今回は、Ｃ言語を使って４桁の７セグＬＥＤを点灯制御します。 本ブログでは、組み込みソフトウェアについて初歩から習得で [&#8230;]</p>
<p>The post <a href="https://initial-jj.com/entry/2021/0214/howto_embedded/">絶対にわかる組み込みソフトウェア 8: 4桁7セグLEDダイナミック点灯～ソースコード公開～</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使った、組み込みソフトウェアを理解する入門シリーズ第８回。<br />
今回は、Ｃ言語を使って４桁の７セグＬＥＤを点灯制御します。</p>
<p>本ブログでは、組み込みソフトウェアについて初歩から習得できるよう、カテゴリを作って簡単なプログラムから順に紹介しています。<br />
includeしているライブラリやビルド方法、GPIO制御の為にマッピングしている処理については過去記事で説明しています。<br />
プログラミングに興味がある方や、今回の記事で用語がわからない方は、まずは下記記事を初回から御覧下さい。<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td>月初50万スタートデイトレは数を撃たないスキャルパー。投資以外の事も綴っています。ノーマル専のパチスロカス。LOVEリーチ目。<br><div class="lkc-unlink" title="https://initial-jj.com/entry/category/pc_and_software/embedded_software">鬱リーマン、不毛な日々と時々デイトレ</div> - 鬱リーマン、不毛な日々と時々デイトレ</td></tr></tbody></table></div><br />
「絶対にわかる」と謳っていますが、Ｃ言語と１６進数について最低限の知識がある方向けとなります。<br />
言語習得はたくさん良質な書籍が出ていますので、そちらで独習する事をオススメします。<br />
その為、完全初心者に対しての説明は割愛しています。<br />
Ｃ言語については、最後に私のオススメ本を紹介していますので、興味のある方は参考にして下さい。</p>
<p>今回の記事の導入部にあたる記事はこちらになります。データシートや配線図について記載しています。<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td>Raspberry Pi(ラズペリーパイ)を使った、組み込みソフトウェアを理解する入門シリーズ第７回。今回は、Ｃ言語を使って４桁の７セグＬＥＤを点灯制御します。本ブログでは、組み込みソフトウェアについて初歩から習得できるよう、カテゴリを作って紹介しています。プログラミングに興味がある方や、今回の記事で用語がわからない方は、過去記事を御覧下さい。本ブログの主旨は「組み込みソフトウェアを自力で作るスキルを習得する」事にあります。python言語やWiringPi等のライブラリを使えば、「なぜ動作するのか？」という知識が無く...<br><a class="lkc-link no_icon" href="https://initial-jj.com/entry/2021/0118/howto_embedded">絶対にわかる組み込みソフトウェア 7: 4桁7セグLED点灯制御～回路図紹介～</a> - 鬱リーマン、不毛な日々と時々デイトレ</td></tr></tbody></table></div></p>
<p><b><u>本ブログの主旨は「組み込みソフトウェアを自力で作るスキルを習得する」事にあります</u></b>。</p>
<p><span class="marker" style="color: #0000cc;">python言語やWiringPi等のライブラリを使えば、「なぜ動作するのか？」という知識が無くとも機器を制御するプログラムを書く事ができますが、「もっと低層の制御方法を知りたい」、「自力でライブラリを書くスキルを身に着けたい」、「応用力を身につけたい」という方に向けた記事となります。</span><br />
ソースコードはＣ言語初心者でも読みやすいよう、極力簡単に書きました。可読性を重視した為、マジックナンバーを多用しています。</p>
<blockquote><p><b><u>The main purpose of this blog is to &#8220;learn the skills to create embedded software on your own&#8221;.</u></b></p>
<p>By using python language and libraries such as WiringPi, you can write programs to control devices without having knowledge of &#8220;why does it work? However, this article is intended for those who want to learn more about low-level control methods and acquire the skills to write libraries on their own.<br />
The source code has been written as simply as possible so that it can be easily read by C beginners. For the sake of readability, I have used a lot of magic numbers.</p></blockquote>
<div class="section">

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">配線図</a></li><li><a href="#toc2" tabindex="0">７セグのデータシート</a></li><li><a href="#toc3" tabindex="0">ソースコード</a></li><li><a href="#toc4" tabindex="0">プログラムの実行方法</a></li><li><a href="#toc5" tabindex="0">プログラムの実行結果</a></li><li><a href="#toc6" tabindex="0">プログラムの説明</a></li></ol>
    </div>
  </div>

<h2 id="配線図"><span id="toc1">配線図</span></h2>
<p>配線図は前回の記事に記載していますので、そちらを御覧下さい。</p>
<blockquote><p>Please refer to the previous article for the wiring diagram.</p></blockquote>
<p><a href="https://initial-jj.com/entry/2021/0118/howto_embedded#%E7%B5%90%E7%B7%9A%E5%9B%B3">絶対にわかる組み込みソフトウェア 7: 4桁7セグLED点灯制御～回路図紹介～ &#8211; 鬱リーマン、デイトレとパチスロと不毛な日々</a></p>
</div>
<div class="section">
<h2 id="７セグのデータシート"><span id="toc2">７セグのデータシート</span></h2>
<p>データシートは前回の記事に記載していますので、そちらを御覧下さい。</p>
<blockquote><p>Please refer to the previous article for the datasheet.</p></blockquote>
<p><a href="https://initial-jj.com/entry/2021/0118/howto_embedded#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AE%E5%85%A5%E6%89%8B">絶対にわかる組み込みソフトウェア 7: 4桁7セグLED点灯制御～回路図紹介～ &#8211; 鬱リーマン、デイトレとパチスロと不毛な日々</a></p>
</div>
<div class="section">
<h2 id="ソースコード"><span id="toc3">ソースコード</span></h2>
<pre class="code lang-c" data-lang="c" data-unlink=""><span class="synPreProc">#include </span><span class="synConstant">&lt;stdio.h&gt;</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;bcm_host.h&gt;</span>		<span class="synComment">/* required to use bcm_host_get_peripheral_address() */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;fcntl.h&gt;</span>			<span class="synComment">/* required to use open(), close(), usleep() */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;sys/mman.h&gt;</span>		<span class="synComment">/* required to use mmap(), munmap() */</span>
<span class="synPreProc">#define BLOCK_SIZE	(</span><span class="synConstant">4096</span><span class="synPreProc">)			</span><span class="synComment">/* マッピングするメモリサイズ(4KByte) */</span>
<span class="synPreProc">#define	GPIO_OFFSET	(</span><span class="synConstant">0x00200000</span><span class="synPreProc">)	</span><span class="synComment">/* see p.91 of dataseet		*/</span>
<span class="synPreProc">#define	GPFSEL0		(</span><span class="synConstant">0x00</span><span class="synPreProc">)			</span><span class="synComment">/* GPFSEL0 Address下位1byte	*/</span>
<span class="synPreProc">#define	GPFSEL1		(</span><span class="synConstant">0x04</span><span class="synPreProc">)			</span><span class="synComment">/* GPFSEL1 Address下位1byte	*/</span>
<span class="synPreProc">#define	GPFSEL2		(</span><span class="synConstant">0x08</span><span class="synPreProc">)			</span><span class="synComment">/* GPFSEL2 Address下位1byte	*/</span>
<span class="synPreProc">#define	GPSET0		(</span><span class="synConstant">0x1c</span><span class="synPreProc">)			</span><span class="synComment">/* GPSET0  Address下位1byte	*/</span>
<span class="synPreProc">#define	GPCLR0		(</span><span class="synConstant">0x28</span><span class="synPreProc">)			</span><span class="synComment">/* GPCLR0  Address下位1byte	*/</span>
<span class="synPreProc">#define	GPLEV0		(</span><span class="synConstant">0x34</span><span class="synPreProc">)			</span><span class="synComment">/* GPLEV0  Address下位1byte */</span>
<span class="synType">char</span> seg_map[<span class="synConstant">11</span>][<span class="synConstant">8</span>] = {
<span class="synComment">    /*13 14 18 19 23 24 25 26 pin */</span>
<span class="synComment">    /*DP  B  F  C  A  E  D  G segment */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 0 */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 1 */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span> },	<span class="synComment">/* 2 */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span> },	<span class="synComment">/* 3 */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span> },	<span class="synComment">/* 4 */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span> },	<span class="synComment">/* 5 */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span> },	<span class="synComment">/* 6 */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 7 */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span> },	<span class="synComment">/* 8 */</span>
    {  <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span> },	<span class="synComment">/* 9 */</span>
    {  <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span> }		<span class="synComment">/* DP */</span>
};
<span class="synType">int</span>	getSegData( <span class="synType">int</span> num );
<span class="synComment">
/****************************************************************/</span>
<span class="synComment">/* main function						*/</span>
<span class="synComment">/****************************************************************/</span>
<span class="synType">int</span> main( <span class="synType">void</span> )
{
<span class="synType">    volatile</span>	<span class="synType">unsigned</span> <span class="synType">int</span> *gpio;
<span class="synType">    void</span> *map;
<span class="synType">    int</span> fd;
<span class="synType">    int</span> adr_gpio_base;
<span class="synType">    int</span> sleep_time;
<span class="synType">    int</span> i = <span class="synConstant">0</span>;
<span class="synType">    int</span> j = <span class="synConstant">0</span>;
<span class="synType">    int</span> k = <span class="synConstant">0</span>;
<span class="synComment">
    /*==========================================================*/</span>
    <span class="synComment">/* GPIO制御レジスタ・アドレスを取得し、map変数に代入する	*/</span>
<span class="synComment">    /*==========================================================*/</span>
    fd = open( <span class="synConstant">"/dev/mem"</span>, (O_RDWR | O_SYNC) );
<span class="synComment">    /* open()エラー処理割愛 */</span>
    ;
<span class="synComment">    /*------------------------------------------------------------------------------------------*/</span>
    <span class="synComment">/* refer to																					*/</span>
    <span class="synComment">/* https://www.raspberrypi.org/documentation/hardware/raspberrypi/peripheral_addresses.md	*/</span>
    <span class="synComment">/*																							*/</span>
    <span class="synComment">/* ペリフェラル物理アドレスがラズパイ世代で異なる為、互換性を持たせる為に		*/</span>
    <span class="synComment">/* bcm_host_get_peripheral_address()でプログラム実行マシンの上の物理アドレスを取得する	*/</span>
<span class="synComment">    /*------------------------------------------------------------------------------------------*/</span>
    adr_gpio_base = bcm_host_get_peripheral_address();
<span class="synComment">    /* mapにペリフェラル物理アドレスをマッピング */</span>
    map = mmap( <span class="synConstant">NULL</span>,
        BLOCK_SIZE,
        PROT_WRITE,
        MAP_SHARED,
        fd,
        (adr_gpio_base + GPIO_OFFSET) );
<span class="synComment">    /* mmap()エラー処理割愛 */</span>
    ;
    close( fd );
<span class="synComment">    /*==========================================================*/</span>
    <span class="synComment">/* GPIO 初期設定						*/</span>
<span class="synComment">    /*==========================================================*/</span>
    gpio = (<span class="synType">unsigned</span> <span class="synType">int</span> *)map;
    gpio[GPFSEL0/<span class="synConstant">4</span>]	= <span class="synConstant">0x00001040</span>;	<span class="synComment">/* FSEL2,4 */</span>
    gpio[GPFSEL1/<span class="synConstant">4</span>]	= <span class="synConstant">0x09009200</span>;	<span class="synComment">/* FSEL13,14,15,18,19 */</span>
    gpio[GPFSEL2/<span class="synConstant">4</span>]	= <span class="synConstant">0x00049208</span>;	<span class="synComment">/* FSEL21,23,24,25,26 */</span>
    gpio[GPSET0/<span class="synConstant">4</span>]	= <span class="synConstant">0x07ACE014</span>;	<span class="synComment">/* GPIO Pin Output Set Registers */</span>
    gpio[GPCLR0/<span class="synConstant">4</span>]	= <span class="synConstant">0x00000000</span>;
    gpio[GPLEV0/<span class="synConstant">4</span>]	= <span class="synConstant">0x0</span>;
    usleep( <span class="synConstant">100000</span> );
<span class="synComment">    /*==========================================================*/</span>
    <span class="synComment">/* 7seg点灯処理						*/</span>
<span class="synComment">    /*==========================================================*/</span>
    sleep_time = <span class="synConstant">150000</span>;
<span class="synStatement">    for</span>( k = <span class="synConstant">0</span>; k &lt; <span class="synConstant">200</span>; k++ ){
<span class="synComment">        /*--------------------------------------*/</span>
        <span class="synComment">/* digit select				*/</span>
<span class="synComment">        /*--------------------------------------*/</span>
<span class="synStatement">        for</span>( j = <span class="synConstant">0</span>; j &lt; <span class="synConstant">4</span>; j++ ){
            gpio[GPCLR0/<span class="synConstant">4</span>]	= <span class="synConstant">0x00208014</span>;	<span class="synComment">/* DIGIT selector ALL LO */</span>
<span class="synStatement">            switch</span>( j ){
<span class="synStatement">                case</span> <span class="synConstant">0</span>:	<span class="synComment">/* DIGIT.1 */</span>
                    gpio[GPSET0/<span class="synConstant">4</span>] = <span class="synConstant">0x00008000</span>;	<span class="synComment">/* GPIO 15 HI */</span>
<span class="synStatement">                    break</span>;
<span class="synStatement">                case</span> <span class="synConstant">1</span>:	<span class="synComment">/* DIGIT.2 */</span>
                    gpio[GPSET0/<span class="synConstant">4</span>] = <span class="synConstant">0x00000010</span>;	<span class="synComment">/* GPIO 4 HI */</span>
<span class="synStatement">                    break</span>;
<span class="synStatement">                case</span> <span class="synConstant">2</span>:	<span class="synComment">/* DIGIT.3 */</span>
                    gpio[GPSET0/<span class="synConstant">4</span>] = <span class="synConstant">0x00000004</span>;	<span class="synComment">/* GPIO 2 HI */</span>
<span class="synStatement">                    break</span>;
<span class="synStatement">                case</span> <span class="synConstant">3</span>:	<span class="synComment">/* DIGIT.4 */</span>
                    gpio[GPSET0/<span class="synConstant">4</span>] = <span class="synConstant">0x00200000</span>;	<span class="synComment">/* GPIO 21 HI */</span>
<span class="synStatement">                    break</span>;
<span class="synStatement">                default</span>:
<span class="synStatement">                    break</span>;
            }
<span class="synComment">            /*----------------------------------*/</span>
            <span class="synComment">/* LED lighting			*/</span>
<span class="synComment">            /*----------------------------------*/</span>
<span class="synStatement">            switch</span>( j ){
<span class="synStatement">                case</span> <span class="synConstant">0</span>:	<span class="synComment">/* DIGIT.1 */</span>
                    gpio[GPCLR0/<span class="synConstant">4</span>] = getSegData( <span class="synConstant">1</span> );
<span class="synStatement">                    break</span>;
<span class="synStatement">                case</span> <span class="synConstant">1</span>:	<span class="synComment">/* DIGIT.2 */</span>
                    gpio[GPCLR0/<span class="synConstant">4</span>] = getSegData( <span class="synConstant">2</span> );
<span class="synStatement">                    break</span>;
<span class="synStatement">                case</span> <span class="synConstant">2</span>:	<span class="synComment">/* DIGIT.3 */</span>
                    gpio[GPCLR0/<span class="synConstant">4</span>] = getSegData( <span class="synConstant">3</span> );
<span class="synStatement">                    break</span>;
<span class="synStatement">                case</span> <span class="synConstant">3</span>:	<span class="synComment">/* DIGIT.4 */</span>
                    gpio[GPCLR0/<span class="synConstant">4</span>] = getSegData( <span class="synConstant">4</span> );
<span class="synStatement">                    break</span>;
<span class="synStatement">                default</span>:
<span class="synStatement">                    break</span>;
            }
            usleep( sleep_time );
            gpio[GPSET0/<span class="synConstant">4</span>]	= <span class="synConstant">0x07ACE014</span>;
<span class="synComment">            /*------------------------------------------*/</span>
<span class="synComment">            /* Gradually speed up the lighting interval */</span>
<span class="synComment">            /*------------------------------------------*/</span>
<span class="synStatement">            if</span>( sleep_time &gt; <span class="synConstant">3000</span> ){
                sleep_time -= <span class="synConstant">1000</span>;
            }
        }
    }
<span class="synComment">    /* GPIO deinit */</span>
    gpio[GPFSEL0/<span class="synConstant">4</span>]	= <span class="synConstant">0x00000000</span>;
    gpio[GPFSEL1/<span class="synConstant">4</span>]	= <span class="synConstant">0x00000000</span>;
    gpio[GPFSEL2/<span class="synConstant">4</span>]	= <span class="synConstant">0x00000000</span>;
    munmap( map, BLOCK_SIZE );
<span class="synStatement">
    return</span> <span class="synConstant">0</span>;
}
<span class="synComment">
/****************************************************************/</span>
<span class="synComment">/* Segment lighting data creation				*/</span>
<span class="synComment">/****************************************************************/</span>
<span class="synType">int</span>	getSegData( <span class="synType">int</span> num )
{
<span class="synType">    int</span>	data = <span class="synConstant">0x00000000</span>;
<span class="synComment">    /*13 14 18 19 23 24 25 26 pin */</span>
<span class="synComment">    /*DP  B  F  C  A  E  D  G segment */</span>
    data |= (seg_map[num][<span class="synConstant">0</span>] &lt;&lt; <span class="synConstant">13</span>);
    data |= (seg_map[num][<span class="synConstant">1</span>] &lt;&lt; <span class="synConstant">14</span>);
    data |= (seg_map[num][<span class="synConstant">2</span>] &lt;&lt; <span class="synConstant">18</span>);
    data |= (seg_map[num][<span class="synConstant">3</span>] &lt;&lt; <span class="synConstant">19</span>);
    data |= (seg_map[num][<span class="synConstant">4</span>] &lt;&lt; <span class="synConstant">23</span>);
    data |= (seg_map[num][<span class="synConstant">5</span>] &lt;&lt; <span class="synConstant">24</span>);
    data |= (seg_map[num][<span class="synConstant">6</span>] &lt;&lt; <span class="synConstant">25</span>);
    data |= (seg_map[num][<span class="synConstant">7</span>] &lt;&lt; <span class="synConstant">26</span>);
<span class="synStatement">
    return</span> data;
}
</pre>
</div>
<h2 id="プログラムの実行方法"><span id="toc4">プログラムの実行方法</span></h2>
<pre class="code lang-sh" data-lang="sh" data-unlink="">$ gcc main.c <span class="synSpecial">-I</span>/opt/vc/include <span class="synSpecial">-L</span>/opt/vc/lib <span class="synSpecial">-lbcm_host</span>
$ sudo ./a.out
</pre>
<div class="section">
<h2 id="プログラムの実行結果"><span id="toc5">プログラムの実行結果</span></h2>
<div align="center"><iframe src="https://www.youtube.com/embed/MIBUKSEXhgI?feature=oembed" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe><cite class="hatena-citation"><a rel="noopener" target="_blank" href="https://youtu.be/MIBUKSEXhgI">youtu.be<span class="fa fa-external-link external-icon anchor-icon"></span></a></cite></div>
<p>ジャンパー線が足りなかったので、配線図とは異なり抵抗を使用していません。</p>
<p>コーディングからデバッグまで行い、特にデバッグに時間がかかる場合、バグが発生して特定のセグメントが点灯しっぱなしになる事が想定されます。<br />
このような時に、抵抗を挟んでいないと電流の流れすぎによってＬＥＤの損傷や劣化が進むので、初心者の方は必ず抵抗を挟むようにして下さい。</p>
<blockquote><p>Since I didn&#8217;t have enough jumper wires, I didn&#8217;t use any resistors, unlike the wiring diagram.<br />
The LED will not cut out if there is a short period of continuity, but if you want to see it in action, make sure to put a resistor in between.</p></blockquote>
</div>
<div class="section">
<h2 id="プログラムの説明"><span id="toc6">プログラムの説明</span></h2>
<p>今回もWiringPiというGPIO制御ライブラリは使わずに実装しました。</p>
<p>多数のGPIO端子を使用したので、GPFSELnレジスタは0～2の３レジスタを使用しています。<br />
なぜこの設定値になるのか、設定値設計に使用した表を添付しますので参考にして下さい。<br />
<div style="width: 810px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20210214001730.jpg"><img fetchpriority="high" decoding="async" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20210214001730.jpg" width="800" height="322" alt="組み込みソフトウェア ラズパイ GPIO GPFSEL" class="size-full" /></a><p class="wp-caption-text">GPFSEL0～GPFSEL2レジスタ設定値</p></div><br />
GPSET0レジスタの設定値は07ACE014Hとなります。<br />
アノード・コモンなので、GPSET0に07ACE014Hを書き込んで全てのピンをＨＩにする事で、ＬＥＤ消灯状態にしています。<br />
これは、使用しているGPIOピン番号を見て頂ければ、該当ピンを全て１をセットしている事がわかると思います。<br />
下記に、端子割付表のリンクを貼っておきます。</p>
<blockquote><p>The setting value of the GPSET0 register is 07ACE014H.<br />
Since this is an anode common, we write 07ACE014H to GPSET0 to set all pins to HI, thus making the LED off.<br />
If you look at the GPIO pin numbers used, you will see that all the pins are set to 1.<br />
The following is a link to the terminal assignment table.</p></blockquote>
<p><a href="https://initial-jj.com/entry/2021/0118/howto_embedded#%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4GPIO-pin-No%E3%82%92%E6%98%87%E9%A0%86%E3%81%AB%E4%B8%A6%E3%81%B9%E3%81%9F%E7%AB%AF%E5%89%B2%E8%A1%A8">絶対にわかる組み込みソフトウェア 7: 4桁7セグLED点灯制御～回路図紹介～ &#8211; 鬱リーマン、デイトレとパチスロと不毛な日々</a></p>
<p>&nbsp;</p>
<p>DIGIT.1～DIGIT.4を順番にHIレベルに上げて、表示する桁を切り替えています。<br />
１桁の表示時間は、最初は150msからスタートし、徐々に点灯時間を短くしています。<br />
１桁を表示終了した時点で、点灯時間を1ms減算し、最終的には3ms間隔で点灯させています。</p>
<p>このように、１桁ずつ点灯させて全てのＬＥＤを表示させる方式をダイナミック点灯方式と呼びます。<br />
全てのセグメントを常時点灯させない理由は複数ありますが、１つのメリットは消費電流を抑える事です。</p>
<p>この方式は身の回りにある家電で一般的に使われています。<br />
写真やビデオ撮影した時に、７セグなどの表示が欠けて見える事があります。<br />
それは、このダイナミック点灯間隔が長く、かつ、消灯中のセグメントが撮影された場合に起こります。<br />
5ms前後の間隔であれば、肉眼では常時点灯しているように見えます。これより間隔が長いとチラツキがわかります。</p>
<p>&nbsp;</p>
<p>点灯させるセグメントデータは前回の１桁７セグ表示プログラムと同様に、getSegData()関数で作成しています。<br />
(配線が変わったので、関数内の処理は異なっています。)<br />
使い方は前回と同じで、引数の数値に対応したセグメント点灯データを戻り値で返却します。</p>
<p>この関数については、配線図とGPCLR0レジスタの各ビットの意味をデータシートで確認すれば、何をやっているのかわかりますので、ソースコードが読みやすいように、意図的にマジックナンバーを使って実装しました。</p>
<p>&nbsp;</p>
<p>今回はここまでとなります。</p>
<p>ラズパイは非常に安価でLinux PCとしても遊べるので、興味がある方は手に取ってみて下さい。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品","b":"Raspberry Pi","t":"Raspberry Pi 4 Model B 4GB","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51opPFsZz2L.jpg","\/51Mjj4Wr2pL.jpg","\/51JO5QS330L.jpg","\/41GK9ou44ZL._SL500_.jpg","\/41NxsmH2JoL.jpg","\/51eNI-V65gL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081YD3VL5","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"DsKTy","s":"s"});</script></p>
<div id="msmaflink-DsKTy">リンク</div>
</div>
<p>KeeYees電子工作キットにはブレッドボード、抵抗、ＬＥＤ、リード線(コの字ワイヤやジャンパー線)など、電子工作部品が一式揃っているので、電子工作の取っ掛かりにオススメのセットです。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"KeeYees 電子工作キット 初心者向け スターターキット 電子部品 基本部品56種類 エレクトロニクス入門キット Electronics Fun Kit Arduino用 Raspberry Pi用 チュートリアルあり","b":"KeeYees","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/61vRPie6ipL.jpg","\/51Hi9QvkE1L.jpg","\/51qm5-evtaL.jpg","\/51IeuuuSTiL.jpg","\/51TVYt5gU7L.jpg","\/51dzzPesGML.jpg","\/51M0VmYHKYL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081F7FNR7","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"X5Exd","s":"s"});</script></p>
<div id="msmaflink-X5Exd">リンク</div>
</div>
<p>Ｃ言語を習得するなら、オススメなのは独習Ｃです。説明がわかりやすく、これ１冊でＣ言語マスターになれる名著です。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"独習C 新版","b":"","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51y9kynLn6L.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B07876M3J6","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"XqNhb","s":"s"});</script></p>
<div id="msmaflink-XqNhb">リンク</div>
</div>
<p>ご覧いただき、ありがとうございました。<br />
ランキングに参加しています。<span style="color: #0000cc;">ポチッと押して去って頂けく方に感謝です。<strong>ありがとうございます。</strong></span><br />
<a rel="noopener" target="_blank" href="https://blogmura.com/ranking/in?p_cid=11037140"><img decoding="async" src="https://b.blogmura.com/88_31.gif" alt="ブログランキング・にほんブログ村へ" width="88" height="31" border="0" />にほんブログ村<span class="fa fa-external-link external-icon anchor-icon"></span></a><br />
<a rel="noopener" target="_blank" href="https://blog.with2.net/link/?id=2039323"><img decoding="async" title="人気ブログランキング" src="https://blog.with2.net/img/banner/banner_21.gif" /></a><br />
<a rel="noopener" target="_blank" style="font-size: 0.9em;" href="https://blog.with2.net/link/?id=2039323">人気ブログランキング<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
</div><p>The post <a href="https://initial-jj.com/entry/2021/0214/howto_embedded/">絶対にわかる組み込みソフトウェア 8: 4桁7セグLEDダイナミック点灯～ソースコード公開～</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://initial-jj.com/entry/2021/0214/howto_embedded/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2131</post-id>	</item>
		<item>
		<title>絶対にわかる組み込みソフトウェア 7: 4桁7セグLED点灯制御～回路図紹介～</title>
		<link>https://initial-jj.com/entry/2021/0118/howto_embedded/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=2021-0118-howto_embedded</link>
					<comments>https://initial-jj.com/entry/2021/0118/howto_embedded/#respond</comments>
		
		<dc:creator><![CDATA[Initial_JJ]]></dc:creator>
		<pubDate>Mon, 18 Jan 2021 09:30:00 +0000</pubDate>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ＰＣ・ソフトウェア]]></category>
		<guid isPermaLink="false">https://initial-jj.com/entry/2021-0118-howto_embedded/</guid>

					<description><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使った、組み込みソフトウェアを理解する入門シリーズ第７回。 今回は、Ｃ言語を使って４桁の７セグＬＥＤを点灯制御します。 本ブログでは、組み込みソフトウェアについて初歩から習得で [&#8230;]</p>
<p>The post <a href="https://initial-jj.com/entry/2021/0118/howto_embedded/">絶対にわかる組み込みソフトウェア 7: 4桁7セグLED点灯制御～回路図紹介～</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使った、組み込みソフトウェアを理解する入門シリーズ第７回。<br />
今回は、Ｃ言語を使って４桁の７セグＬＥＤを点灯制御します。</p>
<p>本ブログでは、組み込みソフトウェアについて初歩から習得できるよう、カテゴリを作って紹介しています。<br />
プログラミングに興味がある方や、今回の記事で用語がわからない方は、過去記事を御覧下さい。<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td>月初50万スタートデイトレは数を撃たないスキャルパー。投資以外の事も綴っています。ノーマル専のパチスロカス。LOVEリーチ目。<br><div class="lkc-unlink" title="https://initial-jj.com/entry/category/pc_and_software/embedded_software">鬱リーマン、不毛な日々と時々デイトレ</div> - 鬱リーマン、不毛な日々と時々デイトレ</td></tr></tbody></table></div></p>
<p><b><u>本ブログの主旨は「組み込みソフトウェアを自力で作るスキルを習得する」事にあります</u></b>。</p>
<p><span style="color: #0000cc;">python言語やWiringPi等のライブラリを使えば、「なぜ動作するのか？」という知識が無くとも機器を制御するプログラムを書く事ができますが、「もっと低層の制御方法を知りたい」、「自力でライブラリを書くスキルを身に着けたい」という方に向けた記事となります。</span></p>
<div class="section">

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">データシートの入手</a></li><li><a href="#toc2" tabindex="0">端子割付表</a><ol><li><a href="#toc3" tabindex="0">ラズパイGPIO pin Noを昇順に並べた端割表</a></li><li><a href="#toc4" tabindex="0">7セグLED pin Noを昇順に並べた端割表</a></li></ol></li><li><a href="#toc5" tabindex="0">結線図</a></li></ol>
    </div>
  </div>

<h2 id="データシートの入手"><span id="toc1">データシートの入手</span></h2>
<p>今回使用した７セグＬＥＤは「５６４１ＢＳ」です。</p>
<figure class="figure-image figure-image-fotolife" title="5641BS">
<div class="images-row mceNonEditable"><img decoding="async" class="hatena-fotolife" title="" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20210117215059.png" alt="5641BS 7セグメントLED 7segment" /><img decoding="async" class="hatena-fotolife" title="" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20210117215102.png" alt="5641BS 7セグメントLED 7segment" /></div><figcaption>5641BS</figcaption></figure>
<p>ネットで品番を調べると、簡単にデータシートを閲覧できます。<br />
スタート地点はここからです。データシートを見て、各ピンの機能を理解しましょう。<br />
参考までにリンクを貼っておきます。<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td>FORYARD FYQ-5641BS-21 | Display. Model No. Rev.FYQ-5641BS-21 APRODUCT SPECIFICATION：Model No. FYQ-5641BS-21Descriptions:■0.56.<br><a rel="noopenner noopener" target="_blank" class="lkc-link no_icon" href="https://datasheetspdf.com/pdf/1258365/FORYARD/FYQ-5641BS-21/1">FYQ-5641BS-21 Display Datasheet pdf - Digits Display. Equivalent, Catalog<span class="fa fa-external-link external-icon anchor-icon"></span></a> - datasheetspdf.com</td></tr></tbody></table></div><br />
また、データシート内でプログラマにとって肝となる情報は以下の箇所です。</p>
<figure class="figure-image figure-image-fotolife" title="ピン番号とセグメント対応図"><img decoding="async" class="hatena-fotolife" title="" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20210117213349.jpg" alt="5641BG 7セグLED 7segment" /><figcaption>ピン番号とセグメント対応図</figcaption></figure>
<p>大きめの図をリンクしておいたので、スマホで閲覧される方はタップして拡大表示して下さい。</p>
<p>Circuit Diagramsを見ると、前回使用した１桁７セグＬＥＤと同様、アノードコモンである事がわかります。<br />
ＬＥＤのアノードコモン、カソードコモンについては過去記事で説明していますので、こちらを御覧下さい。<br />
<iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="絶対にわかる組み込みソフトウェア 4: 7セグLEDとラズパイとの接続方法 - 鬱リーマン、デイトレとパチスロと不毛な日々" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finitial-jj.com%2Fentry%2F2020%2F10%2F21%2Fhowto_embedded" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://initial-jj.com/entry/2020/10/21/howto_embedded">www.initial-jj.com</a></cite></p>
<p>１２，９，８，６番ピンは、４～１桁目のどのセグメント(＝ＬＥＤ) を点灯させるかに使用します。<br />
Ａ～Ｇ、ＤＰの点灯は各桁を共通ピンで制御する為、一定間隔で１２，９，８，６番ピンの１つだけをＨＩレベルにして各桁を点灯させます。</p>
<p>例えば、１２番ピンをＨＩレベル＆３番ピンをＬＯレベルにすると、&#8221;All Light On Segments Feature &amp; Pin Position&#8221; の図に記載されている「ＤＰ」のセグメントが点灯する事になります。</p>
<p>&nbsp;</p>
<p>このような、１桁ずつ点灯箇所を切り替える方式を<b><u>「ダイナミック点灯方式」</u></b>と呼びます。<br />
カメラで撮影した時、ＬＥＤの一部が消える現象は、このダイナミック点灯方式によるものです。</p>
<p><span style="color: #0000cc;">カメラのシャッタースピードが早く、それよりもＬＥＤが消灯している時間が長い場合に、肉眼では残像によって点灯していると認識していても、写真は一部のセグメントが消灯中に撮影されるからです。</span></p>
<p>ダイナミック点灯の詳細については、次回説明します。</p>
<p>&nbsp;</p>
<p>5641BSは、本ブログで紹介本ブログで紹介しているKeeYees電子工作キットに同梱されています。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"KeeYees 電子工作キット 初心者向け スターターキット 電子部品 基本部品56種類 エレクトロニクス入門キット Electronics Fun Kit Arduino用 Raspberry Pi用 チュートリアルあり","b":"KeeYees","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/61vRPie6ipL.jpg","\/51Hi9QvkE1L.jpg","\/51qm5-evtaL.jpg","\/51IeuuuSTiL.jpg","\/51TVYt5gU7L.jpg","\/51dzzPesGML.jpg","\/51M0VmYHKYL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081F7FNR7","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"X5Exd","s":"s"});</script></p>
<div id="msmaflink-X5Exd">リンク</div>
</div>
<p>購入時期によっては、異なる７セグＬＥＤがパッケージングされているかもしれません。その場合は、該当品番をネットを調べてデータシートを入手して下さい。</p>
</div>
<div class="section">
<h2 id="端子割付表"><span id="toc2">端子割付表</span></h2>
<p>制御機器の端子のどれとどれを結線しているのかを記したものを「端子割付表」と言います。<br />
省略して「端割(たんわり)」と呼ばれます。</p>
<p>一般的には、マイコン等制御する側のピン番号を昇順に並べて記述し、これと接続する相手側を横に書きます。<br />
今回は、この一般的な表記法と合わせて、ＬＥＤ側のピン番号をメインとした端割の２つを記載します。<br />
どちらも内容は同じです。ご自身で見やすいと思う方をご覧下さい。</p>
<div class="section">
<h3 id="ラズパイGPIO-pin-Noを昇順に並べた端割表"><span id="toc3">ラズパイGPIO pin Noを昇順に並べた端割表</span></h3>
<style><!-- --></style>
<table>
<thead>
<tr>
<th><span style="font-size: 80%;">ラズパイ GPIO</span></th>
<th><span style="font-size: 80%;">7 seg LED pin</span></th>
<th><span style="font-size: 80%;">7 seg LED function</span></th>
</tr>
</thead>
<tbody>
<tr>
<th><span style="font-size: 80%;">2</span></th>
<td><span style="font-size: 80%;">8</span></td>
<td><span style="font-size: 80%;">DIGIT.3</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">4</span></th>
<td><span style="font-size: 80%;">9</span></td>
<td><span style="font-size: 80%;">DIGIT.2</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">13</span></th>
<td><span style="font-size: 80%;">3</span></td>
<td><span style="font-size: 80%;">DP</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">14</span></th>
<td><span style="font-size: 80%;">7</span></td>
<td><span style="font-size: 80%;">B</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">15</span></th>
<td><span style="font-size: 80%;">12</span></td>
<td><span style="font-size: 80%;">DIGIT.1</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">18</span></th>
<td><span style="font-size: 80%;">10</span></td>
<td><span style="font-size: 80%;">F</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">19</span></th>
<td><span style="font-size: 80%;">4</span></td>
<td><span style="font-size: 80%;">C</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">21</span></th>
<td><span style="font-size: 80%;">6</span></td>
<td><span style="font-size: 80%;">DIGIT.4</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">23</span></th>
<td><span style="font-size: 80%;">11</span></td>
<td><span style="font-size: 80%;">A</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">24</span></th>
<td><span style="font-size: 80%;">1</span></td>
<td><span style="font-size: 80%;">E</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">25</span></th>
<td><span style="font-size: 80%;">2</span></td>
<td><span style="font-size: 80%;">D</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">26</span></th>
<td><span style="font-size: 80%;">5</span></td>
<td><span style="font-size: 80%;">G</span></td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<h3 id="7セグLED-pin-Noを昇順に並べた端割表"><span id="toc4">7セグLED pin Noを昇順に並べた端割表</span></h3>
<style><!-- --></style>
<table>
<thead>
<tr>
<th><span style="font-size: 80%;">7 seg LED pin</span></th>
<th><span style="font-size: 80%;">7 seg LED function</span></th>
<th><span style="font-size: 80%;">ラズパイ GPIO</span></th>
</tr>
</thead>
<tbody>
<tr>
<th><span style="font-size: 80%;">1</span></th>
<td><span style="font-size: 80%;">E</span></td>
<td><span style="font-size: 80%;">24</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">2</span></th>
<td><span style="font-size: 80%;">D</span></td>
<td><span style="font-size: 80%;">25</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">3</span></th>
<td><span style="font-size: 80%;">DP</span></td>
<td><span style="font-size: 80%;">13</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">4</span></th>
<td><span style="font-size: 80%;">C</span></td>
<td><span style="font-size: 80%;">19</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">5</span></th>
<td><span style="font-size: 80%;">G</span></td>
<td><span style="font-size: 80%;">26</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">6</span></th>
<td><span style="font-size: 80%;">DIGIT.4</span></td>
<td><span style="font-size: 80%;">21</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">7</span></th>
<td><span style="font-size: 80%;">B</span></td>
<td><span style="font-size: 80%;">14</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">8</span></th>
<td><span style="font-size: 80%;">DIGIT.3</span></td>
<td><span style="font-size: 80%;">2</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">9</span></th>
<td><span style="font-size: 80%;">DIGIT.2</span></td>
<td><span style="font-size: 80%;">4</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">10</span></th>
<td><span style="font-size: 80%;">F</span></td>
<td><span style="font-size: 80%;">18</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">11</span></th>
<td><span style="font-size: 80%;">A</span></td>
<td><span style="font-size: 80%;">23</span></td>
</tr>
<tr>
<th><span style="font-size: 80%;">12</span></th>
<td><span style="font-size: 80%;">DIGIT.1</span></td>
<td><span style="font-size: 80%;">15</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="section">
<h2 id="結線図"><span id="toc5">結線図</span></h2>
<p>最後に、ラズパイとの結線図を紹介します。<br />
あくまで一例ですので、同じＧＰＩＯを使う必要性はありません。<br />
ブレッドボードを使って図示した場合に描きやすいように結線しただけなので、それ以外のピン選択理由はありません。</p>
<figure class="figure-image figure-image-fotolife" title="回路図"><img decoding="async" class="hatena-fotolife" title="" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20210117213355.jpg" alt="ラズパイ 7セグLED 4桁 4digit 回路図" /><figcaption>回路図</figcaption></figure>
<p>これも大きめの図をリンクしてあるので、クリック(＝タップ)して拡大して御覧下さい。</p>
<p>&nbsp;</p>
<p>配線の「赤」はＶＤＤ、「黒」はＧＮＤです。<br />
図ではＧＮＤもブレッドボードと結線していますが、カソードコモンＬＥＤなので未使用となります。実際には結線しなくても構いません。</p>
<p>また、見やすいように、ＬＥＤのアノード側を緑、カソード側を黄色に、ＤＩＧＩＴセレクタは青で色分けしました。<br />
抵抗値は、前回までと同様４７０Ωです。</p>
<p>&nbsp;</p>
<p>今回はここまでとなります。<br />
次回、ＬＥＤを点灯させるＣ言語プログラムをご紹介します。</p>
<p>&nbsp;</p>
<p>ラズパイは非常に安価でLinux PCとしても遊べるので、興味がある方は手に取ってみて下さい。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品","b":"Raspberry Pi","t":"Raspberry Pi 4 Model B 4GB","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51opPFsZz2L.jpg","\/51Mjj4Wr2pL.jpg","\/51JO5QS330L.jpg","\/41GK9ou44ZL._SL500_.jpg","\/41NxsmH2JoL.jpg","\/51eNI-V65gL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081YD3VL5","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"DsKTy","s":"s"});</script></p>
<div id="msmaflink-DsKTy">リンク</div>
</div>
<p>KeeYees電子工作キットにはブレッドボード、抵抗、ＬＥＤ、リード線(コの字ワイヤやジャンパー線)など、電子工作部品が一式揃っているので、電子工作の取っ掛かりにオススメのセットです。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"KeeYees 電子工作キット 初心者向け スターターキット 電子部品 基本部品56種類 エレクトロニクス入門キット Electronics Fun Kit Arduino用 Raspberry Pi用 チュートリアルあり","b":"KeeYees","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/61vRPie6ipL.jpg","\/51Hi9QvkE1L.jpg","\/51qm5-evtaL.jpg","\/51IeuuuSTiL.jpg","\/51TVYt5gU7L.jpg","\/51dzzPesGML.jpg","\/51M0VmYHKYL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081F7FNR7","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"X5Exd","s":"s"});</script></p>
<div id="msmaflink-X5Exd">リンク</div>
</div>
<p>Ｃ言語を習得するなら、オススメなのは独習Ｃです。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"独習C 新版","b":"","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51y9kynLn6L.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B07876M3J6","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"XqNhb","s":"s"});</script></p>
<div id="msmaflink-XqNhb">リンク</div>
</div>
<p>ご覧いただき、ありがとうございました。<br />
ランキングに参加しています。<span style="color: #0000cc;">ポチッと押して去って頂けると、<strong>次回に続く</strong>。</span></p>
<p><a rel="noopener" target="_blank" href="https://blogmura.com/ranking/in?p_cid=11037140"><img decoding="async" src="https://b.blogmura.com/88_31.gif" alt="ブログランキング・にほんブログ村へ" width="88" height="31" border="0" />にほんブログ村<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p><a rel="noopener" target="_blank" href="https://blog.with2.net/link/?id=2039323"><img decoding="async" title="人気ブログランキング" src="https://blog.with2.net/img/banner/banner_21.gif" /></a><br />
<a rel="noopener" target="_blank" style="font-size: 0.9em;" href="https://blog.with2.net/link/?id=2039323">人気ブログランキング<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
</div><p>The post <a href="https://initial-jj.com/entry/2021/0118/howto_embedded/">絶対にわかる組み込みソフトウェア 7: 4桁7セグLED点灯制御～回路図紹介～</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://initial-jj.com/entry/2021/0118/howto_embedded/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2154</post-id>	</item>
		<item>
		<title>絶対にわかる組み込みソフトウェア 5: C言語で7セグLED点灯制御</title>
		<link>https://initial-jj.com/entry/2020/11/03/howto_embedded/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=2020-11-03-howto_embedded</link>
					<comments>https://initial-jj.com/entry/2020/11/03/howto_embedded/#respond</comments>
		
		<dc:creator><![CDATA[Initial_JJ]]></dc:creator>
		<pubDate>Tue, 03 Nov 2020 07:30:00 +0000</pubDate>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ＰＣ・ソフトウェア]]></category>
		<guid isPermaLink="false">https://initial-jj.com/entry/2020-11-03-howto_embedded/</guid>

					<description><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解する入門シリーズ第６回。 今回は、Ｃ言語を使って７セグＬＥＤを点灯します。 組み込みソフトウェアを作るスキルを習得するのが目的であれば、ライブラ [&#8230;]</p>
<p>The post <a href="https://initial-jj.com/entry/2020/11/03/howto_embedded/">絶対にわかる組み込みソフトウェア 5: C言語で7セグLED点灯制御</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解する入門シリーズ第６回。</p>
<p>今回は、Ｃ言語を使って７セグＬＥＤを点灯します。<br />
組み込みソフトウェアを作るスキルを習得するのが目的であれば、ライブラリの使用は極力控え、下層レベルの処理を自ら書けるようになる目標を持つべきだと思います。</p>
<p><span class="marker-under">この記事はそのような方に向けた情報にしていますので、<b><span style="color: #ff0000;">WiringPiを使わずに書きました</span></b>。</span><br />
WiringPiというライブラリと使えば、レジスタを触ることなく簡単にGPIOが制御できますが、最初からこのようなライブラリに頼ったソースコードを書く癖がつくと、どのように制御しているかと言う肝の部分が理解できず、応用が効かないエンジニアになります。</p>
<p>今回は、極力原始的なソースコードを書きました。<br />
仕組みがわかったら、その上でライブラリを上手く利用して効率よく良くコードをプログラム作成をすれば良いと思います。</p>
<p>また、ソースコードの説明を書いていますが、Ｃ言語を習得している事を前提としているので、Ｃ言語そのものについての詳細説明は割愛しています。<br />
<span class="marker-under">Ｃ言語を学習するにあたり、私がバイブルと思っている学習本を最後に紹介していますので、そちらを御覧下さい。<strong>名著です。</strong></span></p>
<p>ラズパイと７セグＬＥＤの接続方法については、こちらを御覧下さい。<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解する入門シリーズ第５回。今回から、７セグＬＥＤを接続して、数字を表示させてみます。まずは、ラズパイと７セグＬＥＤの接続方法について。前回のＬＥＤ点滅(Ｌチカ)については、こちらを御覧下さい。ラズパイは非常に安価でLinux PCとしても遊べるので、興味がある方は手に取ってみて下さい。(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b=b||function(){arguments.currentScript=c.currentScript||c.scripts;(b.q=b.q||).push(arguments)};c.getElementB...<br><a class="lkc-link no_icon" href="https://initial-jj.com/entry/2020/10/21/howto_embedded">絶対にわかる組み込みソフトウェア 4: 7セグLEDとラズパイとの接続方法</a> - 鬱リーマン、不毛な日々と時々デイトレ</td></tr></tbody></table></div></p>
<div class="section">

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">7セグLEDとGPIO ピン番号対応図</a></li><li><a href="#toc2" tabindex="0">ソースコード</a></li><li><a href="#toc3" tabindex="0">プログラムの実行方法</a></li><li><a href="#toc4" tabindex="0">ソースコードの説明</a><ol><ol><li><a href="#toc5" tabindex="0">70行目: gpio[GPFSEL0/4] = 0x09249240;</a></li><li><a href="#toc6" tabindex="0">72行目: gpio[GPSET0/4] = 0x000003FC;</a></li><li><a href="#toc7" tabindex="0">81行目: gpio[GPCLR0/4] = getSegData( i );</a></li><li><a href="#toc8" tabindex="0">83行目: gpio[GPSET0/4] = 0x000003FC;</a></li><li><a href="#toc9" tabindex="0">92行目: getSegData() 関数</a></li></ol></li></ol></li><li><a href="#toc10" tabindex="0">プログラム実行結果</a></li></ol>
    </div>
  </div>

<h2 id="7セグLEDとGPIO-ピン番号対応図"><span id="toc1">7セグLEDとGPIO ピン番号対応図</span></h2>
<p>今回配線したGPIOピン番号を７セグＬＥＤ図に赤字で付記しました。この配線を元に制御します。</p>
<div style="width: 204px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201103092053.jpg"><img decoding="async" class="size-full" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201103092053.jpg" alt="ラズパイ 7セグ C言語" width="194" height="185" /></a><p class="wp-caption-text">GPIO ピン番号対応図</p></div>
</div>
<div class="section">
<h2 id="ソースコード"><span id="toc2">ソースコード</span></h2>
<pre class="code lang-c" data-lang="c" data-unlink=""><span class="synComment">/* file name : main.c */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;bcm_host.h&gt;</span>		<span class="synComment">/* required to use bcm_host_get_peripheral_address() */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;fcntl.h&gt;</span>			<span class="synComment">/* required to use open(), close(), usleep() */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;sys/mman.h&gt;</span>		<span class="synComment">/* required to use mmap(), munmap() */</span>
<span class="synPreProc">#define BLOCK_SIZE	(</span><span class="synConstant">4096</span><span class="synPreProc">)			</span><span class="synComment">/* マッピングするメモリサイズ(4KByte) */</span>
<span class="synPreProc">#define	GPIO_OFFSET	(</span><span class="synConstant">0x00200000</span><span class="synPreProc">)	</span><span class="synComment">/* see p.91 of dataseet		*/</span>
<span class="synPreProc">#define	GPFSEL0		(</span><span class="synConstant">0x00</span><span class="synPreProc">)			</span><span class="synComment">/* GPFSEL0 Address下位1byte	*/</span>
<span class="synPreProc">#define	GPSET0		(</span><span class="synConstant">0x1c</span><span class="synPreProc">)			</span><span class="synComment">/* GPSET0  Address下位1byte	*/</span>
<span class="synPreProc">#define	GPCLR0		(</span><span class="synConstant">0x28</span><span class="synPreProc">)			</span><span class="synComment">/* GPCLR0  Address下位1byte	*/</span>
<span class="synPreProc">#define	GPLEV0		(</span><span class="synConstant">0x34</span><span class="synPreProc">)			</span><span class="synComment">/* GPLEV0  Address下位1byte	*/</span>
<span class="synType">int</span>	getSegData( <span class="synType">int</span> num );			<span class="synComment">/* GPIO 7セグ点灯データ作成処理 */</span>
<span class="synType">char</span> seg_map[<span class="synConstant">11</span>][<span class="synConstant">8</span>] = {
<span class="synComment">/*2  3  4  5  6  7  8  9 pin */</span>
{ <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 0 */</span>
{ <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 1 */</span>
{ <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 2 */</span>
{ <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 3 */</span>
{ <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 4 */</span>
{ <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 5 */</span>
{ <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 6 */</span>
{ <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 7 */</span>
{ <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 8 */</span>
{ <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">0</span> },	<span class="synComment">/* 9 */</span>
{ <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span> }	<span class="synComment">/* DP */</span>
};
<span class="synType">int</span> main( <span class="synType">void</span> )
{
<span class="synType">volatile</span>	<span class="synType">unsigned</span> <span class="synType">int</span> *gpio;
<span class="synType">void</span> *map;
<span class="synType">int</span> fd;
<span class="synType">int</span> adr_gpio_base;
<span class="synType">int</span>	i = <span class="synConstant">0</span>;
<span class="synComment">/*==========================================================*/</span>
<span class="synComment">/* GPIO制御レジスタ・アドレスを取得し、map変数に代入する	*/</span>
<span class="synComment">/*==========================================================*/</span>
fd = open( <span class="synConstant">"/dev/mem"</span>, (O_RDWR | O_SYNC) );
<span class="synComment">/* open()エラー処理割愛 */</span>
;
<span class="synComment">/*------------------------------------------------------------------------------------------*/</span>
<span class="synComment">/* refer to																					*/</span>
<span class="synComment">/* https://www.raspberrypi.org/documentation/hardware/raspberrypi/peripheral_addresses.md	*/</span>
<span class="synComment">/*																							*/</span>
<span class="synComment">/* ペリフェラル物理アドレスがラズパイ世代で異なる為、互換性を持たせる為に		*/</span>
<span class="synComment">/* bcm_host_get_peripheral_address()でプログラム実行マシンの上の物理アドレスを取得する	*/</span>
<span class="synComment">/*------------------------------------------------------------------------------------------*/</span>
adr_gpio_base = bcm_host_get_peripheral_address();
<span class="synComment">/* mapにペリフェラル物理アドレスをマッピング */</span>
map = mmap( <span class="synConstant">NULL</span>,
BLOCK_SIZE,
PROT_WRITE,
MAP_SHARED,
fd,
(adr_gpio_base + GPIO_OFFSET) );
<span class="synComment">/* mmap()エラー処理割愛 */</span>
;
close( fd );
<span class="synComment">/*==========================================================*/</span>
<span class="synComment">/* GPIO 初期設定						*/</span>
<span class="synComment">/*==========================================================*/</span>
gpio = (<span class="synType">unsigned</span> <span class="synType">int</span> *)map;
gpio[GPFSEL0/<span class="synConstant">4</span>]	= <span class="synConstant">0x09249240</span>;
gpio[GPSET0/<span class="synConstant">4</span>]	= <span class="synConstant">0x000003FC</span>;
gpio[GPCLR0/<span class="synConstant">4</span>]	= <span class="synConstant">0x00000000</span>;
gpio[GPLEV0/<span class="synConstant">4</span>]	= <span class="synConstant">0x0</span>;
usleep( <span class="synConstant">500000</span> );
<span class="synComment">/*==========================================================*/</span>
<span class="synComment">/* 7seg点灯処理						*/</span>
<span class="synComment">/*==========================================================*/</span>
<span class="synStatement">for</span>( i = <span class="synConstant">0</span>; i &lt; <span class="synConstant">11</span>; i++ ){
gpio[GPCLR0/<span class="synConstant">4</span>] = getSegData( i );
usleep( <span class="synConstant">500000</span> );
gpio[GPSET0/<span class="synConstant">4</span>] = <span class="synConstant">0x000003FC</span>;
}
gpio[GPFSEL0/<span class="synConstant">4</span>]	= <span class="synConstant">0x00000000</span>;
munmap( map, BLOCK_SIZE );
<span class="synStatement">return</span> <span class="synConstant">0</span>;
}
<span class="synType">int</span>	getSegData( <span class="synType">int</span> num )
{
<span class="synType">int</span>	data = <span class="synConstant">0x00000000</span>;
data |= (seg_map[num][<span class="synConstant">0</span>] &lt;&lt; <span class="synConstant">2</span>);
data |= (seg_map[num][<span class="synConstant">1</span>] &lt;&lt; <span class="synConstant">3</span>);
data |= (seg_map[num][<span class="synConstant">2</span>] &lt;&lt; <span class="synConstant">4</span>);
data |= (seg_map[num][<span class="synConstant">3</span>] &lt;&lt; <span class="synConstant">5</span>);
data |= (seg_map[num][<span class="synConstant">4</span>] &lt;&lt; <span class="synConstant">6</span>);
data |= (seg_map[num][<span class="synConstant">5</span>] &lt;&lt; <span class="synConstant">7</span>);
data |= (seg_map[num][<span class="synConstant">6</span>] &lt;&lt; <span class="synConstant">8</span>);
data |= (seg_map[num][<span class="synConstant">7</span>] &lt;&lt; <span class="synConstant">9</span>);
<span class="synStatement">return</span> data;
}
</pre>
</div>
<div class="section">
<h2 id="プログラムの実行方法"><span id="toc3">プログラムの実行方法</span></h2>
<pre class="code lang-sh" data-lang="sh" data-unlink="">$ gcc main.c <span class="synSpecial">-I</span>/opt/vc/include <span class="synSpecial">-L</span>/opt/vc/lib <span class="synSpecial">-lbcm_host</span>
$ sudo ./a.out
</pre>
</div>
<div class="section">
<h2 id="ソースコードの説明"><span id="toc4">ソースコードの説明</span></h2>
<p>Ｌチカ制御のソースコードを流用していますので、ベースの説明はこちらを御覧下さい。<br />
ライブラリを使わずにGPIOを制御する方法は、上記記事で説明しています。<br />
制御レジスタの詳細や、データシートのリンク先も上記記事で紹介しています。<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解する入門シリーズ第４回。プログラミングの楽しさがわかるよラズパイにLEDを繋ぎ、C言語で書いたプログラムでLEDを点滅させる、通称「Ｌチカ」を実現してみました。今回は、いよいよ組み込みソフトウェアの肝となるデバイス制御部の作り方についての説明です。タイトルで「誰でもわかる」と謳っていますが、第１回から順に読んで頂く事が前提となります。必ず仕組みがわかるようになります。www.initial-jj.comwww.initial-jj.comwww.initial-jj.com前回はＣ言語のソー...<br><a class="lkc-link no_icon" href="https://initial-jj.com/entry/2020/09/17/howto_embbeded">絶対にわかる組み込みソフトウェア 3: C言語Lチカのプログラム詳細解説</a> - 鬱リーマン、不毛な日々と時々デイトレ</td></tr></tbody></table></div><br />
今回のプログラムは「０→１→２　～　９→１０→．」と点灯する処理となっています。</p>
<div class="section">
<h4 id="70行目-gpioGPFSEL04--0x09249240"><span id="toc5">70行目: gpio[GPFSEL0/4] = 0x09249240;</span></h4>
<p>GPFSEL0レジスタのGPIO2～9番をOUT設定にしています。<br />
GPFSEL0レジスタの詳細はデータシートを見ればわかるのですが、内容を簡単に知りたい方は上に貼った過去記事で解説しているので御覧下さい。</p>
</div>
<div class="section">
<h4 id="72行目-gpioGPSET04--0x000003FC"><span id="toc6">72行目: gpio[GPSET0/4] = 0x000003FC;</span></h4>
<p>GPIO2～9番を制御して7セグ全てを消灯させています。初期化です。</p>
</div>
<div class="section">
<h4 id="81行目-gpioGPCLR04--getSegData-i-"><span id="toc7">81行目: gpio[GPCLR0/4] = getSegData( i );</span></h4>
<p>getSegData()という関数を作り、ここで７セグ点灯データを作成しています。<br />
今回使った７セグＬＥＤはアノード・コモンなので、GPCLRレジスタを制御してGPIOをLOレベルに落とすとセグメントが点灯します。GPCLRの点灯させたいGPIO対応ビットに１をセットすると点灯する事になります。<br />
関数への引数i は、数値の０～１０を代入します。<br />
０～９のいずれかの値を渡すと、その数字に対応したセグメント点灯データが戻り値として返ってきます。<br />
１０を渡すと、ＤＰが点灯します。</p>
</div>
<div class="section">
<h4 id="83行目-gpioGPSET04--0x000003FC"><span id="toc8">83行目: gpio[GPSET0/4] = 0x000003FC;</span></h4>
<p>次のデータ表示前にGPSETレジスタのGPIO2～9pin対応ビットに１をセットして、全セグメントを消灯させます。</p>
</div>
<div class="section">
<h4 id="92行目-getSegData-関数"><span id="toc9">92行目: getSegData() 関数</span></h4>
<p>二次元配列seg_mapに点灯させたいデータを用意しています。<br />
GPCLR0は下位2ビット目がGPIO 2pin、そこから上位に順番に3pin～9pinまで並んでいます。<br />
なので、seg_mapのデータを2ビット左シフト～9ビット左シフトを順番に行い、全てのセグメント点灯情報を作成しています。<br />
この関数はもっとスマートな書き方がありますが、可読性を重視した実装としました。<br />
この関数で作成されるデータは下記となります。<br />
０：0x0000017c<br />
１：0x00000018<br />
２：0x000000ec<br />
３：0x000000dc<br />
４：0x00000198<br />
５：0x000001d4<br />
６：0x000001f4<br />
７：0x0000011c<br />
８：0x000001fc<br />
９：0x000001dc<br />
．：0x00000200</p>
</div>
</div>
<div class="section">
<h2 id="プログラム実行結果"><span id="toc10">プログラム実行結果</span></h2>
<div align="center"><iframe loading="lazy" src="https://www.youtube.com/embed/Q6ckmKe-VRM?feature=oembed" width="480" height="270" frameborder="0" allowfullscreen="allowfullscreen"></iframe><cite class="hatena-citation"><a rel="noopener" target="_blank" href="https://youtu.be/Q6ckmKe-VRM">youtu.be<span class="fa fa-external-link external-icon anchor-icon"></span></a></cite></div>
<p>ラズパイは非常に安価でLinux PCとしても遊べるので、興味がある方は手に取ってみて下さい。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品","b":"Raspberry Pi","t":"Raspberry Pi 4 Model B 4GB","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51opPFsZz2L.jpg","\/51Mjj4Wr2pL.jpg","\/51JO5QS330L.jpg","\/41GK9ou44ZL._SL500_.jpg","\/41NxsmH2JoL.jpg","\/51eNI-V65gL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081YD3VL5","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"DsKTy","s":"s"});</script></p>
<div id="msmaflink-DsKTy">リンク</div>
</div>
<p>KeeYees電子工作キットにはブレッドボード、抵抗、ＬＥＤ、リード線(コの字ワイヤやジャンパー線)など、電子工作部品が一式揃っているので、電子工作の取っ掛かりにオススメのセットです。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"KeeYees 電子工作キット 初心者向け スターターキット 電子部品 基本部品56種類 エレクトロニクス入門キット Electronics Fun Kit Arduino用 Raspberry Pi用 チュートリアルあり","b":"KeeYees","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/61vRPie6ipL.jpg","\/51Hi9QvkE1L.jpg","\/51qm5-evtaL.jpg","\/51IeuuuSTiL.jpg","\/51TVYt5gU7L.jpg","\/51dzzPesGML.jpg","\/51M0VmYHKYL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081F7FNR7","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"X5Exd","s":"s"});</script></p>
<div id="msmaflink-X5Exd">リンク</div>
</div>
<p>Ｃ言語を習得するなら、オススメなのは独習Ｃです。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"独習C 新版","b":"","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51y9kynLn6L.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B07876M3J6","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"XqNhb","s":"s"});</script></p>
<div id="msmaflink-XqNhb">リンク</div>
</div>
<p>ご覧いただき、ありがとうございました。<br />
ランキングに参加しています。<span style="color: #0000cc;">ポチッと押して去って頂く方に感謝します。<strong>ありがとうございます。</strong></span></p>
<p><a rel="noopener" target="_blank" href="https://blogmura.com/ranking/in?p_cid=11037140"><img decoding="async" src="https://b.blogmura.com/88_31.gif" alt="ブログランキング・にほんブログ村へ" width="88" height="31" border="0" />にほんブログ村<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p><a rel="noopener" target="_blank" href="https://blog.with2.net/link/?id=2039323"><img decoding="async" title="人気ブログランキング" src="https://blog.with2.net/img/banner/banner_21.gif" /></a><br />
<a rel="noopener" target="_blank" style="font-size: 0.9em;" href="https://blog.with2.net/link/?id=2039323">人気ブログランキング<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
</div><p>The post <a href="https://initial-jj.com/entry/2020/11/03/howto_embedded/">絶対にわかる組み込みソフトウェア 5: C言語で7セグLED点灯制御</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://initial-jj.com/entry/2020/11/03/howto_embedded/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2216</post-id>	</item>
		<item>
		<title>絶対にわかる組み込みソフトウェア 4: 7セグLEDとラズパイとの接続方法</title>
		<link>https://initial-jj.com/entry/2020/10/21/howto_embedded/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=2020-10-21-howto_embedded</link>
					<comments>https://initial-jj.com/entry/2020/10/21/howto_embedded/#respond</comments>
		
		<dc:creator><![CDATA[Initial_JJ]]></dc:creator>
		<pubDate>Wed, 21 Oct 2020 07:30:00 +0000</pubDate>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ＰＣ・ソフトウェア]]></category>
		<guid isPermaLink="false">https://initial-jj.com/entry/2020-10-21-howto_embedded/</guid>

					<description><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解する入門シリーズ第５回。 今回から、７セグＬＥＤを接続して、数字を表示させてみます。 まずは、ラズパイと７セグＬＥＤの接続方法について。 前回の [&#8230;]</p>
<p>The post <a href="https://initial-jj.com/entry/2020/10/21/howto_embedded/">絶対にわかる組み込みソフトウェア 4: 7セグLEDとラズパイとの接続方法</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解する入門シリーズ第５回。</p>
<p>今回から、７セグＬＥＤを接続して、数字を表示させてみます。<br />
まずは、ラズパイと７セグＬＥＤの接続方法について。<br />
前回のＬＥＤ点滅(Ｌチカ)については、こちらを御覧下さい。<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解する入門シリーズ第４回。プログラミングの楽しさがわかるよラズパイにLEDを繋ぎ、C言語で書いたプログラムでLEDを点滅させる、通称「Ｌチカ」を実現してみました。今回は、いよいよ組み込みソフトウェアの肝となるデバイス制御部の作り方についての説明です。タイトルで「誰でもわかる」と謳っていますが、第１回から順に読んで頂く事が前提となります。必ず仕組みがわかるようになります。www.initial-jj.comwww.initial-jj.comwww.initial-jj.com前回はＣ言語のソー...<br><a class="lkc-link no_icon" href="https://initial-jj.com/entry/2020/09/17/howto_embbeded">絶対にわかる組み込みソフトウェア 3: C言語Lチカのプログラム詳細解説</a> - 鬱リーマン、不毛な日々と時々デイトレ</td></tr></tbody></table></div></p>
<p>ラズパイは非常に安価でLinux PCとしても遊べるので、興味がある方は手に取ってみて下さい。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品","b":"Raspberry Pi","t":"Raspberry Pi 4 Model B 4GB","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51opPFsZz2L.jpg","\/51Mjj4Wr2pL.jpg","\/51JO5QS330L.jpg","\/41GK9ou44ZL._SL500_.jpg","\/41NxsmH2JoL.jpg","\/51eNI-V65gL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081YD3VL5","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"DsKTy","s":"s"});</script></p>
<div id="msmaflink-DsKTy">リンク</div>
</div>
<p>KeeYees電子工作キットにはブレッドボード、抵抗、ＬＥＤ、リード線(コの字ワイヤやジャンパー線)など、電子工作部品が一式揃っているので、電子工作の取っ掛かりにオススメのセットです。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"KeeYees 電子工作キット 初心者向け スターターキット 電子部品 基本部品56種類 エレクトロニクス入門キット Electronics Fun Kit Arduino用 Raspberry Pi用 チュートリアルあり","b":"KeeYees","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/61vRPie6ipL.jpg","\/51Hi9QvkE1L.jpg","\/51qm5-evtaL.jpg","\/51IeuuuSTiL.jpg","\/51TVYt5gU7L.jpg","\/51dzzPesGML.jpg","\/51M0VmYHKYL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081F7FNR7","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"X5Exd","s":"s"});</script></p>
<div id="msmaflink-X5Exd">リンク</div>
</div>
<div class="section">

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">7セグメントLEDとは？</a><ol><li><a href="#toc2" tabindex="0">アノード・コモンとカソード・コモン</a><ol><li><a href="#toc3" tabindex="0">アノード・コモン</a></li><li><a href="#toc4" tabindex="0">カソード・コモン</a></li></ol></li></ol></li><li><a href="#toc5" tabindex="0">端子割付表</a></li><li><a href="#toc6" tabindex="0">ブレッドボード</a></li><li><a href="#toc7" tabindex="0">配線図</a></li></ol>
    </div>
  </div>

<h2 id="7セグメントLEDとは"><span id="toc1">7セグメントLEDとは？</span></h2>
<div style="width: 110px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020174114.jpg"><img decoding="async" class="size-full" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020174114.jpg" alt="7セグメントLED" width="100" height="147" /></a><p class="wp-caption-text">7セグメントLED</p></div>
<p>７つのセグメントで構成されているＬＥＤで、この事から７セグメントＬＥＤと言います。通称７セグ。<br />
各セグメントを点灯させる事で数字を表示させる事ができます。<br />
写真の７セグは、右下にドット(デシマル・ポイント)があるので正確には８セグですが、これも７セグと言って通用します。</p>
<div class="section">
<h3 id="アノードコモンとカソードコモン"><span id="toc2">アノード・コモンとカソード・コモン</span></h3>
<p>ＬＥＤ(発光ダイオード)には極性があり、＋側をアノード、ー側をカソードと呼びます。<br />
アノードからカソードにのみ電流が流れ、その際ダイオードが発光します。<br />
７セグＬＥＤは、各セグメントの発光を制御する端子と、コモン端子があります。<br />
アノード側をまとめられているものをアノード・コモン、反対にカソードがまとめられているものをカソード・コモンと言います。</p>
<p>今回使用した７セグＬＥＤの品番は「5611BH」です。<br />
このブログの上部で紹介したKeeYees電子工作キットに入っていた部品ですが、部品の取り扱い説明書は同梱されていません。<br />
パーツには、どこかに型番がプリントされているので、それを頼りにインターネットでデータシートを探します。</p>
<div class="section">
<h4 id="アノードコモン"><span id="toc3">アノード・コモン</span></h4>
<div style="width: 410px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020192159.jpg"><img decoding="async" class="size-full" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020192159.jpg" alt="5611BH アノード・コモン" width="400" height="301" /></a><p class="wp-caption-text">5611BH アノード・コモン</p></div>
<p>(<a rel="noopener" target="_blank" href="https://datasheetspdf.com/pdf-file/1404694/XILTX/5611BH/1">https://datasheetspdf.com/pdf-file/1404694/XILTX/5611BH/1<span class="fa fa-external-link external-icon anchor-icon"></span></a> より抜粋)<br />
これがアノード・コモンです。端子がまとまっている側(上側)がアノード、反対(下側)がカソードです。<br />
5611BHの場合、3番、8番ピンを正極(＋)に接続します。<br />
セグメントには名前が割り当てられており、A～GとDPとなっています。</p>
<div style="width: 136px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020213218.jpg"><img decoding="async" class="size-full" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020213218.jpg" alt="5611BH セグメント 名称" width="126" height="180" /></a><p class="wp-caption-text">各セグメント名称</p></div>
<p>(<a rel="noopener" target="_blank" href="https://datasheetspdf.com/pdf-file/1404694/XILTX/5611BH/1">https://datasheetspdf.com/pdf-file/1404694/XILTX/5611BH/1<span class="fa fa-external-link external-icon anchor-icon"></span></a> より抜粋)<br />
これら(７セグＬＥＤの7,6,4,2,1,9,10,5番ピン)を点灯／消灯させる制御ピンは、ラズパイのGPIOと接続します。<br />
接続したGPIOがON(HIレベル)であればLEDは消灯し、端子をLOレベルに落とすと点灯します。</div>
<div class="section">
<h4 id="カソードコモン"><span id="toc4">カソード・コモン</span></h4>
<p>カソード・コモンの場合、このような回路図となります。</p>
<div style="width: 410px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020192203.jpg"><img decoding="async" class="size-full" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020192203.jpg" alt="7セグLED カソード・コモン" width="400" height="204" /></a><p class="wp-caption-text">カソード・コモン</p></div>
<p>端子がまとまっている側(上側)がカソード、反対(下側)がアノードです。<br />
カソード・コモンを使う場合は、コモン端子をGNDに接続し、セグメント制御端子をHIにすれば電流が流れ、セグメントが点灯します。</p>
</div>
</div>
</div>
<div class="section">
<h2 id="端子割付表"><span id="toc5">端子割付表</span></h2>
<div style="width: 209px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020205442.jpg"><img decoding="async" class="size-full" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020205442.jpg" alt="ラズパイ 7セグ 端子割付表" width="199" height="201" /></a><p class="wp-caption-text">端子割付表</p></div>
<p>配線する前に端子割付表を考えました。<br />
今回はセグメントAから、順番にGPIOの若い番号ピンを割り当てました。</div>
<div class="section">
<h2 id="ブレッドボード"><span id="toc6">ブレッドボード</span></h2>
<div style="width: 510px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020205716.jpg"><img decoding="async" class="size-full" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020205716.jpg" alt="ラズパイ ブレッドボード 7セグ" width="500" height="375" /></a><p class="wp-caption-text">ラズパイ(左)とブレッドボード(右)</p></div>
<p>ブレッドボードとは、はんだ付けせずに電子部品を結線できるボードの事です。<br />
ブレッドボード内部は、下図のように結線されています。</p>
<div style="width: 810px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020210116.jpg"><img decoding="async" class="size-full" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020210116.jpg" alt="ブレッドボード 内部結線図" width="800" height="263" /></a><p class="wp-caption-text">ブレッドボード 内部結線図</p></div>
<p>この内部結線を踏まえて、電源と電子部品を接続します。<br />
通常は赤いラインにVDD(＋極)を、黒いラインをGND(ー極)で電圧を加え、青線に電子部品を刺して回路を構成します。</div>
<div class="section">
<h2 id="配線図"><span id="toc7">配線図</span></h2>
<p>上述の端子割付表を元に、ラズパイと結線した回路図がこちら。</p>
<div style="width: 810px" class="wp-caption aligncenter"><a href="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020210901.jpg"><img decoding="async" class="size-full" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201020210901.jpg" alt="ラズパイ 7セグLED 回路図 配線図" width="800" height="727" /></a><p class="wp-caption-text">7セグLED 配線図</p></div>
<p>今回はここまでとなります。<br />
次回、７セグＬＥＤを点灯するソフトウェアを作ってみます。</p>
<p>ご覧いただき、ありがとうございました。<br />
ランキングに参加しています。<span style="color: #0000cc;">ポチッと押して去って頂く方に感謝です。<strong>ありがとうございます。</strong></span></p>
<p><a rel="noopener" target="_blank" href="https://blogmura.com/ranking/in?p_cid=11037140"><img decoding="async" src="https://b.blogmura.com/88_31.gif" alt="ブログランキング・にほんブログ村へ" width="88" height="31" border="0" />にほんブログ村<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p><a rel="noopener" target="_blank" href="https://blog.with2.net/link/?id=2039323"><img decoding="async" title="人気ブログランキング" src="https://blog.with2.net/img/banner/banner_21.gif" /></a><br />
<a rel="noopener" target="_blank" style="font-size: 0.9em;" href="https://blog.with2.net/link/?id=2039323">人気ブログランキング<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
</div><p>The post <a href="https://initial-jj.com/entry/2020/10/21/howto_embedded/">絶対にわかる組み込みソフトウェア 4: 7セグLEDとラズパイとの接続方法</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://initial-jj.com/entry/2020/10/21/howto_embedded/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2226</post-id>	</item>
		<item>
		<title>絶対にわかる組み込みソフトウェア 3: C言語Lチカのプログラム詳細解説</title>
		<link>https://initial-jj.com/entry/2020/09/17/howto_embbeded/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=2020-09-17_howto_embbeded</link>
					<comments>https://initial-jj.com/entry/2020/09/17/howto_embbeded/#comments</comments>
		
		<dc:creator><![CDATA[Initial_JJ]]></dc:creator>
		<pubDate>Thu, 17 Sep 2020 07:30:00 +0000</pubDate>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ＰＣ・ソフトウェア]]></category>
		<guid isPermaLink="false">https://initial-jj.com/entry/2020-09-17_howto_embbeded/</guid>

					<description><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解する入門シリーズ第４回。 プログラミングの楽しさがわかるよ ラズパイにLEDを繋ぎ、C言語で書いたプログラムでLEDを点滅させる、通称「Ｌチカ」 [&#8230;]</p>
<p>The post <a href="https://initial-jj.com/entry/2020/09/17/howto_embbeded/">絶対にわかる組み込みソフトウェア 3: C言語Lチカのプログラム詳細解説</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解する入門シリーズ第４回。</p>
<figure class="figure-image figure-image-fotolife" title="プログラミングの楽しさがわかるよ"><span itemscope itemtype="http://schema.org/Photograph"><img decoding="async" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200908085339.jpg" alt="Raspberry Pi 2 Model B &#x30E9;&#x30BA;&#x30D1;&#x30A4;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>プログラミングの楽しさがわかるよ</figcaption></figure>
<p>ラズパイにLEDを繋ぎ、C言語で書いたプログラムでLEDを点滅させる、通称「Ｌチカ」を実現してみました。<br />
今回は、いよいよ組み込みソフトウェアの肝となるデバイス制御部の作り方についての説明です。<br />
タイトルで「誰でもわかる」と謳っていますが、第１回から順に読んで頂く事が前提となります。必ず仕組みがわかるようになります。<br />
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finitial-jj.com%2Fentry%2F2020%2F09%2F08%2Fhowto_embbeded" title="絶対にわかる組み込みソフトウェア 序: なぜ機械が動くのか？ - 鬱リーマン、デイトレとパチスロと不毛な日々" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://initial-jj.com/entry/2020/09/08/howto_embbeded">www.initial-jj.com</a></cite><br />
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finitial-jj.com%2Fentry%2F2020%2F09%2F09%2Fhowto_embbeded" title="絶対にわかる組み込みソフトウェア 1: pythonでLED点灯制御 - 鬱リーマン、デイトレとパチスロと不毛な日々" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://initial-jj.com/entry/2020/09/09/howto_embbeded">www.initial-jj.com</a></cite><br />
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finitial-jj.com%2Fentry%2F2020%2F09%2F12%2Fhowto_embbeded" title="絶対にわかる組み込みソフトウェア 2: C言語でLED点灯(Lチカ)制御 - 鬱リーマン、デイトレとパチスロと不毛な日々" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://initial-jj.com/entry/2020/09/12/howto_embbeded">www.initial-jj.com</a></cite><br />
前回はＣ言語のソースコードを公開しました。今回はそのコードの解説を行います。今回の解説で、どのようにハードウェア制御してるのかが理解できるようになります。<br />
組み込みソフトウェア開発に興味のある方は、ラズパイを手にして遊んでみて下さい。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品","b":"Raspberry Pi","t":"Raspberry Pi 4 Model B 4GB","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51opPFsZz2L.jpg","\/51Mjj4Wr2pL.jpg","\/51JO5QS330L.jpg","\/41GK9ou44ZL._SL500_.jpg","\/41NxsmH2JoL.jpg","\/51eNI-V65gL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081YD3VL5","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"DsKTy","s":"s"});</script></p>
<div id="msmaflink-DsKTy">リンク</div>
</div>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"KeeYees 電子工作キット 初心者向け スターターキット 電子部品 基本部品56種類 エレクトロニクス入門キット Electronics Fun Kit Arduino用 Raspberry Pi用 チュートリアルあり","b":"KeeYees","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/61vRPie6ipL.jpg","\/51Hi9QvkE1L.jpg","\/51qm5-evtaL.jpg","\/51IeuuuSTiL.jpg","\/51TVYt5gU7L.jpg","\/51dzzPesGML.jpg","\/51M0VmYHKYL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081F7FNR7","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"X5Exd","s":"s"});</script></p>
<div id="msmaflink-X5Exd">リンク</div>
</div>
<div class="section">

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ソースコード</a></li><li><a href="#toc2" tabindex="0">プログラムの実行方法</a></li><li><a href="#toc3" tabindex="0">コンピューターのデータ(メモリ)の単位について</a><ol><ol><li><a href="#toc4" tabindex="0">最小単位とｎ進法</a></li><li><a href="#toc5" tabindex="0">データ(メモリ)の単位</a></li></ol></li></ol></li><li><a href="#toc6" tabindex="0">GPIOの仕様を読み解く</a><ol><li><a href="#toc7" tabindex="0">ペリフェラルの配置アドレスを調べる</a></li><li><a href="#toc8" tabindex="0">GPIO仕様を理解する</a></li></ol></li><li><a href="#toc9" tabindex="0">ソースコードの説明</a><ol><ol><li><a href="#toc10" tabindex="0">1～3行目(#include)</a></li><li><a href="#toc11" tabindex="0">5～9行目(#define)</a></li><li><a href="#toc12" tabindex="0">12～73行目(main()関数)</a></li><li><a href="#toc13" tabindex="0">23～42行目(open()関数)</a></li><li><a href="#toc14" tabindex="0">51行目(GPFSEL0)</a></li><li><a href="#toc15" tabindex="0">53行目(GPCLR0)</a></li><li><a href="#toc16" tabindex="0">54行目(usleep())</a></li><li><a href="#toc17" tabindex="0">59行目(while)</a></li><li><a href="#toc18" tabindex="0">60行目(GPSET0)</a></li><li><a href="#toc19" tabindex="0">61行目(usleep)</a></li><li><a href="#toc20" tabindex="0">63行目(GPCLR0)</a></li><li><a href="#toc21" tabindex="0">64行目(usleep)</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 id="ソースコード"><span id="toc1">ソースコード</span></h2>
<pre class="code lang-c" data-lang="c" data-unlink><span class="synComment">/* file name : main.c */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;bcm_host.h&gt;</span>		<span class="synComment">/* required to use bcm_host_get_peripheral_address() */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;fcntl.h&gt;</span>		<span class="synComment">/* required to use open(), close(), usleep() */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;sys/mman.h&gt;</span>		<span class="synComment">/* required to use mmap(), munmap() */</span>
<span class="synPreProc">#define BLOCK_SIZE	(</span><span class="synConstant">4096</span><span class="synPreProc">)			</span><span class="synComment">/* マッピングするメモリサイズ(4KByte) */</span>
<span class="synPreProc">#define	GPIO_OFFSET	(</span><span class="synConstant">0x00200000</span><span class="synPreProc">)		</span><span class="synComment">/* see p.91 of dataseet		*/</span>
<span class="synPreProc">#define	GPFSEL0		(</span><span class="synConstant">0x00</span><span class="synPreProc">)			</span><span class="synComment">/* GPFSEL0 Address下位1byte	*/</span>
<span class="synPreProc">#define	GPSET0		(</span><span class="synConstant">0x1c</span><span class="synPreProc">)			</span><span class="synComment">/* GPFSET0 Address下位1byte	*/</span>
<span class="synPreProc">#define	GPCLR0		(</span><span class="synConstant">0x28</span><span class="synPreProc">)			</span><span class="synComment">/* GPFCLR0 Address下位1byte	*/</span>
<span class="synType">int</span> main( <span class="synType">void</span> )
{
<span class="synType">volatile</span>	<span class="synType">unsigned</span> <span class="synType">int</span> *gpio;
<span class="synType">void</span> *map;
<span class="synType">int</span> fd;
<span class="synType">int</span> adr_gpio_base;
<span class="synType">int</span> i = <span class="synConstant">0</span>;
<span class="synComment">/*==========================================================*/</span>
<span class="synComment">/* GPIO制御レジスタ・アドレスを取得し、map変数に代入する	*/</span>
<span class="synComment">/*==========================================================*/</span>
fd = open( <span class="synConstant">&quot;/dev/mem&quot;</span>, (O_RDWR | O_SYNC) );
<span class="synComment">/* open()エラー処理割愛 */</span>
;
<span class="synComment">/*------------------------------------------------------------------------------------------*/</span>
<span class="synComment">/* refer to									*/</span>
<span class="synComment">/* https://www.raspberrypi.org/documentation/hardware/raspberrypi/peripheral_addresses.md*/</span>
<span class="synComment">/*											*/</span>
<span class="synComment">/* ペリフェラル物理アドレスがラズパイ世代で異なる為、互換性を持たせる為に			*/</span>
<span class="synComment">/* bcm_host_get_peripheral_address()でプログラム実行マシンの上の物理アドレスを取得する	*/</span>
<span class="synComment">/*------------------------------------------------------------------------------------------*/</span>
adr_gpio_base = bcm_host_get_peripheral_address();
<span class="synComment">/* mapにペリフェラル物理アドレスをマッピング */</span>
map = mmap( <span class="synConstant">NULL</span>,
BLOCK_SIZE,
PROT_WRITE,
MAP_SHARED,
fd,
(adr_gpio_base + GPIO_OFFSET) );
<span class="synComment">/* mmap()エラー処理割愛 */</span>
;
close( fd );
<span class="synComment">/*==========================================================*/</span>
<span class="synComment">/* GPIO 2pin 初期設定					*/</span>
<span class="synComment">/*==========================================================*/</span>
gpio = (<span class="synType">unsigned</span> <span class="synType">int</span> *)map;
gpio[GPFSEL0/<span class="synConstant">4</span>]	|= <span class="synConstant">0x00000040</span>;
gpio[GPCLR0/<span class="synConstant">4</span>]	|= <span class="synConstant">0x00000002</span>;
usleep( <span class="synConstant">500000</span> );
<span class="synComment">/*==========================================================*/</span>
<span class="synComment">/* LED点滅処理						*/</span>
<span class="synComment">/*==========================================================*/</span>
<span class="synStatement">while</span> (i &lt; <span class="synConstant">5</span> ){
gpio[GPSET0/<span class="synConstant">4</span>]	|= <span class="synConstant">0x00000002</span>;
usleep( <span class="synConstant">250000</span> );
gpio[GPCLR0/<span class="synConstant">4</span>]	|= <span class="synConstant">0x00000002</span>;
usleep( <span class="synConstant">250000</span> );
i++;
}
gpio[GPFSEL0/<span class="synConstant">4</span>]	&amp;= <span class="synConstant">0xfffffffb</span>; <span class="synComment">/* INPUTに戻す(無くても良い処理) */</span>
munmap( map, BLOCK_SIZE );
<span class="synStatement">return</span> <span class="synConstant">0</span>;
}
</pre>
</div>
<div class="section">
<h2 id="プログラムの実行方法"><span id="toc2">プログラムの実行方法</span></h2>
<pre class="code lang-sh" data-lang="sh" data-unlink>$ gcc main.c <span class="synSpecial">-I</span>/opt/vc/include <span class="synSpecial">-L</span>/opt/vc/lib <span class="synSpecial">-lbcm_host</span>
$ sudo ./a.out
</pre>
</div>
<div class="section">
<h2 id="コンピューターのデータメモリの単位について"><span id="toc3">コンピューターのデータ(メモリ)の単位について</span></h2>
<p>ハードウェア仕様書を読むにあたり、最低限知っておくべき知識があります。その１つが、コンピューターで扱う数の単位です。</p>
<div class="section">
<h4 id="最小単位とｎ進法"><span id="toc4">最小単位とｎ進法</span></h4>
<p>メモリの最小単位は「bit(ビット)」と言います。デジタルですから「０」か「１」のどちらかの値を取ります。０と１の２値で数値表現する方法を２進法と言います。<br />
日常生活で使っているのは１０進数と言います。<br />
１０進数は０～９までの１０個の数字を使い、＋１してこの１０個で表現できない値となる時に桁が増えて「１０」と表現します。<br />
２進数は０～１の２個の数字を使い、＋１してこの２個で表現できない値となる時に桁が増えて「１０」と表現します。<br />
他に、１６進数も使います。これは０～Ｆの１６個の文字を使います。<br />
１０進数を、２進数と１６進数に変換した対応表を書いたので参考にして下さい。</p>
<figure class="figure-image figure-image-fotolife" title="n進数 対応表"><span itemscope itemtype="http://schema.org/Photograph"><img decoding="async" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200917015637.jpg" alt="&#x30B3;&#x30F3;&#x30D4;&#x30E5;&#x30FC;&#x30BF;&#x30FC; &#x30D7;&#x30ED;&#x30B0;&#x30E9;&#x30DF;&#x30F3;&#x30B0; n&#x9032;&#x6CD5;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>n進数 対応表</figcaption></figure>
<p>数値が16進数である場合、それ明示する為に、先頭に&#8221;0x&#8221;と書いたり末尾に&#8221;H&#8221;と書きます。</p>
</div>
<div class="section">
<h4 id="データメモリの単位"><span id="toc5">データ(メモリ)の単位</span></h4>
<p>最小単位はbitですが、長さ、重さの単位と同じく値が多くなると別の単位を使います。<br />
8Bitを1Byte(バイト)と表現します。<br />
1,024Byteは1K(キロ)Byteになります。1KBと書く事もあります。<br />
<span style="color: #0000cc">一般的にキロはx1,000倍を表す単位ですが、コンピューターではx1,024倍</span>なので間違わないようにしましょう。</p>
<figure class="figure-image figure-image-fotolife" title="色々なデータ単位"><span itemscope itemtype="http://schema.org/Photograph"><img decoding="async" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200917015646.jpg" alt="&#x30E1;&#x30AC; &#x30AE;&#x30AC; &#x30C6;&#x30E9; &#x3069;&#x306E;&#x4F4D; &#x5024;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>色々なデータ単位</figcaption></figure>
</div>
</div>
<div class="section">
<h2 id="GPIOの仕様を読み解く"><span id="toc6">GPIOの仕様を読み解く</span></h2>
<div class="section">
<h3 id="ペリフェラルの配置アドレスを調べる"><span id="toc7">ペリフェラルの配置アドレスを調べる</span></h3>
<p>ARMのGPIO制御仕様(データシート)はラズパイ公式サイトから入手できます。<br />
<a rel="noopener" target="_blank" href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf">https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf<span class="fa fa-external-link external-icon anchor-icon"></span></a><br />
(<a rel="noopener" target="_blank" href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/datasheets.md">Raspberry Pi Documentation<span class="fa fa-external-link external-icon anchor-icon"></span></a> より)<br />
pdfを別ウィンドウで開いて、データシートを見ながら説明をご覧頂くと、わかりやすいと思います。むしろ、データシートはしっかりと読まないといけません。</p>
<p>p.89からGPIOの説明が書かれていますが、まずはp.5のPeripherals(ペリフェラル)を見てみましょう。<br />
ペリフェラルとは周辺機器(周辺機能) の事で、ARMに内蔵されているハードウェア機能(通信、GPIO他)の事を表しています。</p>
<figure class="figure-image figure-image-fotolife" title="メモリマップ"><span itemscope itemtype="http://schema.org/Photograph"><img decoding="async" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200917015707.jpg" alt="&#x30E9;&#x30BA;&#x30D1;&#x30A4; &#x30E1;&#x30E2;&#x30EA;&#x30DE;&#x30C3;&#x30D7;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>メモリマップ</figcaption></figure>
<p>p.5にはメモリ空間のどこにI/O Peripheralsが割り当てられているかが書かれています。このような図をメモリ・マップと言います。<br />
これにより、Physical Addressは20000000H から配置されている事がわかります。<br />
しかし、Linux OSは仮想アドレス空間でソフトウェアを動作させる仕組みを持っており、物理アドレスを直接アクセスする事はできません。<br />
メモリ保護機能が無いシステムであれば、メモリ・マップに書かれているアドレスに直接アクセスが可能で、ハードウェア制御ができます。</p>
<p>では、どうすれば良いか？<br />
答えは、<a rel="noopener" target="_blank" href="https://www.raspberrypi.org">https://www.raspberrypi.org<span class="fa fa-external-link external-icon anchor-icon"></span></a> の一番下の&#8221;Documentation”を辿っていくと、<a rel="noopener" target="_blank" href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/peripheral_addresses.md">https://www.raspberrypi.org/documentation/hardware/raspberrypi/peripheral_addresses.md<span class="fa fa-external-link external-icon anchor-icon"></span></a> という情報を得られます。</p>
<figure class="figure-image figure-image-fotolife" title="Document抜粋"><span itemscope itemtype="http://schema.org/Photograph"><img decoding="async" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200917015712.jpg" alt="&#x30E9;&#x30BA;&#x30D1;&#x30A4; &#x516C;&#x5F0F;&#x30C9;&#x30AD;&#x30E5;&#x30E1;&#x30F3;&#x30C8; GPIO" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Document抜粋</figcaption></figure>
<p>Pi Zero、Pi Zero Wと第１世代のラズパイは0x20000000にマッピングされていますが、Pi 2、Pi 3では0x3F000000にマッピングされていると書かれています。<br />
また、実際にマッピングされているアドレスを取得する関数が用意されており、それがbcm_host_get_peripheral_address() だと言う事もわかります。<br />
今回書いたソースコード(34行目)は、全世代のラズパイで動くように、ペリフェラルのマッピング・アドレスをこの関数で取得しています。この関数を処理し終わった時に得られる値(戻り値と言う)に、実際に割り当てられているアドレスが入っています。<br />
ソースコードでは、adr_gpio_base という変数にアドレスを格納しています。</p>
<p>なお、このページの最後には、Ｃ言語でbcm_hostライブラリを組み込む時のコンパイル・オプション設定も書かれていますので、どうやってbcm_hostをリンクすれば良いか？という疑問も解決します。</p>
</div>
<div class="section">
<h3 id="GPIO仕様を理解する"><span id="toc8">GPIO仕様を理解する</span></h3>
<p>次に、p.89のGPIO仕様を読み解きます。<br />
p.90から制御レジスタ一覧表が記載されています。<br />
レジスタとは、メモリの１種で、ＣＰＵ内に存在しており、ここに１や０を書き込む事で、決められた動作をします。<br />
レジスタは、演算途中の値を保持する汎用レジスタと呼ばれるもの等色々ありますが、その詳細は割愛します。</p>
<figure class="figure-image figure-image-fotolife" title="GPIO制御レジスタ(一部)"><span itemscope itemtype="http://schema.org/Photograph"><img decoding="async" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200917015725.jpg" alt="&#x30E9;&#x30BA;&#x30D1;&#x30A4; GPIO &#x30EC;&#x30B8;&#x30B9;&#x30BF;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>GPIO制御レジスタ(一部)</figcaption></figure>
<p>「Address」は無視です。上述の通り、プログラムがアクセスするアドレスは別アドレスにマッピングされているからです。<br />
但し、今回使うPi 2では0x3F000000からマッピングされていますが、0x7E200000番地に配置されているレジスタを制御する場合は、0x3F000000をベースアドレスとして、+200000番地のオフセットが必要になります。即ち、0x3F200000番地から任意のアドレスにアクセスする事になります。<br />
「Field Name」はレジスタ名称が書かれています。そのレジスタが持っている機能を略して名前にするのが一般的です。<br />
「Size」はレジスタのサイズです。単位が書かれていませんが、bitです。<br />
これは、ページ先頭の「All accesses are assumed to be 32-bit.」という説明文で明示されています。<br />
話が戻りますが、32bitという事は別の表現で4Byteと言っても同じです。(32bit = 8bit(= 1Byte) x 4)<br />
<span style="color: #0000cc">ここで１番大事なのは、レジスタのサイズを把握しておく事です。4Byteレジスタである事を忘れないで下さい。</span></p>
<p>もう１つ疑問があると思います。「<b><span style="color: #ff0000">どのレジスタを制御すれば、やりたい制御ができるのか？</span></b>」です。<br />
残念ながら、これは<b><span style="color: #ff0000">レジスタの説明を読んで理解するしかありません</span></b>。<br />
今回はGPIO ２番ピンを使っているので、該当するレジスタは</p>
<ol>
<li>GPFSEL0：0xXXXXXX00</li>
<li>GPSET0：0xXXXXXX1C</li>
<li>GPCLR0：0xXXXXXX28</li>
</ol>
<p>です。データシートの該当レジスタの説明を読んでみて下さい。</p>
</div>
</div>
<div class="section">
<h2 id="ソースコードの説明"><span id="toc9">ソースコードの説明</span></h2>
<div class="section">
<h4 id="13行目include"><span id="toc10">1～3行目(#include)</span></h4>
<p>#include で使用するライブラリを「使いますよ」と宣言しています。<br />
どの関数を使用する為にincludeしているかは、コード内のコメントを参照して下さい。<br />
Ｃ言語では、/* */に挟まれた文字列はコメントとして扱われ、プログラム実行に影響を与えません。</p>
</div>
<div class="section">
<h4 id="59行目define"><span id="toc11">5～9行目(#define)</span></h4>
<p>数字や計算式を文字列に置換する役割があります。コースコード内のあちこちに数字を書くと、</p>
<ol>
<li>可読性が低下</li>
<li>保守性が低下</li>
</ol>
<p>と良いことは１つもないので、意味のある文字列に置換して使います。</p>
</div>
<div class="section">
<h4 id="1273行目main関数"><span id="toc12">12～73行目(main()関数)</span></h4>
<p>処理全体で、main関数と呼びます。<br />
関数名を&#8221;main&#8221;とすると、その関数が最初に実行されます。<br />
これはシステムによって異なります。<br />
システムエンジニアがソフトウェア構成を検討する際に違った名前をエントリー・ポイントにする事もありますが、gccでLinuxソフトを書く場合はmain関数だと憶えておけば良いです。</p>
</div>
<div class="section">
<h4 id="2342行目open関数"><span id="toc13">23～42行目(open()関数)</span></h4>
<p>GPIO制御レジスタへアクセスする為の細工です。<br />
上述の通り、レジスタが配置されたアドレスにアクセスする事が禁じられているシステム上で動かすプログラムなので、間接的にレジスタへアクセスできるようにしています。<br />
具体的には、open()関数で&#8221;/dev/mem&#8221;をオープンし、mmap()関数で実際に割り当てられているペリフェラルアドレス空間とリンクさせています。<br />
これで、map変数をリード／ライトすれば、実際のペリフェラルを制御できるようになります。<br />
なお、open()やmmap()関数の実行が失敗(エラー)が発生した場合に、どう振る舞うかを決めて実装しなければなりませんが、今回は必要最低限のソースコードとした為、処理を割愛しています。<br />
市場に出回っている製品に実装されているプログラムは、このようなエラー発生時の処理が多量に入っており、頭を悩ますポイントです。</p>
</div>
<div class="section">
<h4 id="51行目GPFSEL0"><span id="toc14">51行目(GPFSEL0)</span></h4>
<p>２番ピンを出力設定にしています。<br />
データシートのp.91～92に「Table 6-2-GPIO Alternate function select register 0」という表があり、このFSEL2の値を変更しています。</p>
<figure class="figure-image figure-image-fotolife" title="FSELnの制御説明"><span itemscope itemtype="http://schema.org/Photograph"><img decoding="async" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200917015746.jpg" alt="&#x30E9;&#x30BA;&#x30D1;&#x30A4; GPIO &#x30EC;&#x30B8;&#x30B9;&#x30BF; &#x5236;&#x5FA1; &#x65B9;&#x6CD5;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>FSELnの制御説明</figcaption></figure>
<p>FSEL9に説明が書かれていますが、FSEL2も同じです。<br />
このレジスタは上位2bit以外、全て3bitずつGPIOの制御をするレジスタになっています。<br />
FSEL2は8-6bit目に配置されており、この3bitを&#8221;001b&#8221;にすれば、「GPIO Pin 2 is an <span style="color: #ff0000"><b>output</b></span>」となる事がわかります。<br />
なぜ0x00000040を代入しているのか、わかりやすくする為に表を書いたので参考にして下さい。</p>
<figure class="figure-image figure-image-fotolife" title="GPFSEL0の設定値"><span itemscope itemtype="http://schema.org/Photograph"><img decoding="async" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200917015757.jpg" alt="&#x30E9;&#x30BA;&#x30D1;&#x30A4; GPIO GPFSEL0 &#x7D44;&#x307F;&#x8FBC;&#x307F;&#x30BD;&#x30D5;&#x30C8;&#x30A6;&#x30A7;&#x30A2; &#x308F;&#x304B;&#x308B;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>GPFSEL0の設定値</figcaption></figure>
<p>もう１つ重要なポイントがあります。それは<span style="color: #0000cc">map変数のアクセス方法</span>です。</p>
<p>Ｃ言語を知っている方前提の話となりますが、map変数はポインタ型で宣言しています。<br />
void型にしていますが、このレジスタは「32bitアクセスするよう」説明書きがあったので、int型(4Byte単位アクセス)である必要があります。<br />
このmapポインタを配列として使っているので、配列の添字が+1するだけで、アクセスするアドレスは+4になります。<br />
しかし、GPIOレジスタの#define定義は可読性重視の為、実際のアドレス下位1byteとしています。<br />
このdefine定義を添え字として使用しているので、アドレッシングは狙うアドレスの x4倍になります。<br />
その為、<span style="color: #0000cc">添字内で /4 する事で辻褄を合わせています</span>。<br />
他に良い実装方法を思いついていましたが、今回は読みやすさ重視で、このような実装としました。</p>
</div>
<div class="section">
<h4 id="53行目GPCLR0"><span id="toc15">53行目(GPCLR0)</span></h4>
<p>まず、GPIO 2pinを出力LOレベルにしてLEDを消灯させています。</p>
</div>
<div class="section">
<h4 id="54行目usleep"><span id="toc16">54行目(usleep())</span></h4>
<p>システムコールを使用しました。<br />
引数の単位は1usで、与えられた時間sleep(＝処理を止める)させています。</p>
</div>
<div class="section">
<h4 id="59行目while"><span id="toc17">59行目(while)</span></h4>
<p>{}内の処理を5回繰り返します。</p>
</div>
<div class="section">
<h4 id="60行目GPSET0"><span id="toc18">60行目(GPSET0)</span></h4>
<p>GPIO 2pinを出力HIレベルにして、LEDを点灯させています。</p>
</div>
<div class="section">
<h4 id="61行目usleep"><span id="toc19">61行目(usleep)</span></h4>
<p>250ms、LED点灯状態保持</p>
</div>
<div class="section">
<h4 id="63行目GPCLR0"><span id="toc20">63行目(GPCLR0)</span></h4>
<p>GPIO 2pinを出力LOレベルにして、LEDを消灯させています。</p>
</div>
<div class="section">
<h4 id="64行目usleep"><span id="toc21">64行目(usleep)</span></h4>
<p>250ms、LED消灯状態保持</p>
<p>以上が、ソースコードの解説となります。<br />
ソースコードの左に行数を付記したかったのですが、ＣＳＳを大幅に改修する必要があったので、付記できませんでした。<br />
その内リライトしたいと思います。</p>
<p>なお、WiringPiというライブラリを導入すれば、python同様にお手軽にやりたい事を実現できます。<br />
ですが、今回の趣旨は「どうやってデバイス制御をしているか？」の手引き書ですので、極力ライブラリを使わずにソースコードを書きました。<br />
組み込みソフトウェアを作るのは、それなりの見識が無いと難しいとは思いますが、この分野に挑戦してみたいという方が増えるきっかけになれば幸いです。<br />
最終的には「自分で調べる努力と熱意」が必要となりますが、今はWebサイトを使えば英文も簡単に翻訳できるので敷居は低くなっていると思います。是非、自分の手で挑戦してみて下さい。</p>
<p></p>
<p>ご覧いただき、ありがとうございました。<br />
ランキングに参加しています。<span style="color: #0000cc;">ポチッと押して去って頂けると、<strong>次回に続く</strong>。</span></p>
<p><a rel="noopener" target="_blank" href="https://blogmura.com/ranking/in?p_cid=11037140"><img decoding="async" src="https://b.blogmura.com/88_31.gif" width="88" height="31" border="0" alt="ブログランキング・にほんブログ村へ" />にほんブログ村<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p><a rel="noopener" target="_blank" href="https://blog.with2.net/link/?id=2039323"><img decoding="async" src="https://blog.with2.net/img/banner/banner_21.gif" title="人気ブログランキング" /></a><br /><a rel="noopener" target="_blank" href="https://blog.with2.net/link/?id=2039323" style="font-size: 0.9em;">人気ブログランキング<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
</p>
</div>
</div><p>The post <a href="https://initial-jj.com/entry/2020/09/17/howto_embbeded/">絶対にわかる組み込みソフトウェア 3: C言語Lチカのプログラム詳細解説</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://initial-jj.com/entry/2020/09/17/howto_embbeded/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2261</post-id>	</item>
		<item>
		<title>絶対にわかる組み込みソフトウェア 2: C言語でLED点灯(Lチカ)制御</title>
		<link>https://initial-jj.com/entry/2020/09/12/howto_embbeded/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=2020-09-12-howto_embbeded</link>
					<comments>https://initial-jj.com/entry/2020/09/12/howto_embbeded/#respond</comments>
		
		<dc:creator><![CDATA[Initial_JJ]]></dc:creator>
		<pubDate>Sun, 13 Sep 2020 01:30:00 +0000</pubDate>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ＰＣ・ソフトウェア]]></category>
		<guid isPermaLink="false">https://initial-jj.com/entry/2020-09-12-howto_embbeded/</guid>

					<description><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解するシリーズ第３回。 プログラミングの楽しさがわかるよ ラズパイにLEDを繋ぎ、C言語で書いたプログラムでLEDを点滅させる、通称「Ｌチカ」を実 [&#8230;]</p>
<p>The post <a href="https://initial-jj.com/entry/2020/09/12/howto_embbeded/">絶対にわかる組み込みソフトウェア 2: C言語でLED点灯(Lチカ)制御</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解するシリーズ第３回。</p>
<figure class="figure-image figure-image-fotolife" title="プログラミングの楽しさがわかるよ"><img decoding="async" class="hatena-fotolife" title="f:id:initial_jj:20200908085339j:plain" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200908085339.jpg" alt="Raspberry Pi 2 Model B ラズパイ" /><figcaption>プログラミングの楽しさがわかるよ</figcaption></figure>
<p>ラズパイにLEDを繋ぎ、C言語で書いたプログラムでLEDを点滅させる、通称「Ｌチカ」を実現してみます。</p>
<div align="center">
<p>&nbsp;</p>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja">
<p dir="ltr" lang="ja">グローバルIP監視やWi-Fiアクセスポイントにして遊んでたラズパイ。<br />
この前LED買ったからLチカさせた。C言語。 <a rel="noopener" target="_blank" href="https://t.co/Tgf2bYeEXH">pic.twitter.com/Tgf2bYeEXH<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p>— Initial JJ (@initial_jj) <a rel="noopener" target="_blank" href="https://twitter.com/initial_jj/status/1303128669326462976?ref_src=twsrc%5Etfw">2020年9月8日<span class="fa fa-external-link external-icon anchor-icon"></span></a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
</div>
<p><span style="color: #0000cc;">今回はC言語で書いたソースコード公開までですが、次回以降に必ず内容が理解できるよう説明していきますのでお付き合いください。</span><br />
また、タイトルで「誰でもわかる」と謳っていますが、第１回から順に読んで頂く事を前提としています。<br />
<iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="誰でもわかる組み込みソフトウェア 序: なぜ機械が動くのか？ - 鬱リーマン、株式投資とパチスロと不毛な日々" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finitial-jj.com%2Fentry%2F2020%2F09%2F08%2Fhowto_embbeded" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://initial-jj.com/entry/2020/09/08/howto_embbeded">www.initial-jj.com</a></cite><br />
<iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="誰でもわかる組み込みソフトウェア 1: pythonでLED点灯制御 - 鬱リーマン、株式投資とパチスロと不毛な日々" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finitial-jj.com%2Fentry%2F2020%2F09%2F09%2Fhowto_embbeded" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://initial-jj.com/entry/2020/09/09/howto_embbeded">www.initial-jj.com</a></cite></p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品","b":"Raspberry Pi","t":"Raspberry Pi 4 Model B 4GB","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51opPFsZz2L.jpg","\/51Mjj4Wr2pL.jpg","\/51JO5QS330L.jpg","\/41GK9ou44ZL._SL500_.jpg","\/41NxsmH2JoL.jpg","\/51eNI-V65gL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081YD3VL5","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"DsKTy","s":"s"});</script></p>
<div id="msmaflink-DsKTy">リンク</div>
</div>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"KeeYees 電子工作キット 初心者向け スターターキット 電子部品 基本部品56種類 エレクトロニクス入門キット Electronics Fun Kit Arduino用 Raspberry Pi用 チュートリアルあり","b":"KeeYees","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/61vRPie6ipL.jpg","\/51Hi9QvkE1L.jpg","\/51qm5-evtaL.jpg","\/51IeuuuSTiL.jpg","\/51TVYt5gU7L.jpg","\/51dzzPesGML.jpg","\/51M0VmYHKYL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081F7FNR7","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"X5Exd","s":"s"});</script></p>
<div id="msmaflink-X5Exd">リンク</div>
</div>
<div class="section">

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Ｃ言語について</a></li><li><a href="#toc2" tabindex="0">プログラム説明</a><ol><li><a href="#toc3" tabindex="0">ソースコード</a></li><li><a href="#toc4" tabindex="0">プログラムの説明</a></li><li><a href="#toc5" tabindex="0">プログラムの実行方法</a></li><li><a href="#toc6" tabindex="0">プログラムの実行結果</a></li></ol></li></ol>
    </div>
  </div>

<h2 id="Ｃ言語について"><span id="toc1">Ｃ言語について</span></h2>
<p>Ｃ言語はコンパイラ型言語です。<br />
コンパイラ型の詳細は、第２回python編の記事を御覧下さい。</p>
<p><a href="https://initial-jj.com/entry/2020/09/09/howto_embbeded#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">プログラミング言語について</a></p>
<p>Linuxには標準でgccというコンパイラが導入されています。<br />
元々はGNU C Complierの略でgccという名称でしたが、現在はC言語以外のコンパイルにも対応しています。<br />
また、コンパイラと呼ばれますが、gccコマンドに対してオプションと付けずに実行すると、アセンブラ、リンカーを順次呼び出して実行形式ファイル(デフォルトではa.outというファイル名)を作成します。<br />
例えば、-Sオプションを付けてgccを実行するとアセンブラ・コード(拡張子 *.s)を生成します。</p>
</div>
<div class="section">
<h2 id="プログラム説明"><span id="toc2">プログラム説明</span></h2>
<div class="section">
<h3 id="ソースコード"><span id="toc3">ソースコード</span></h3>
<pre class="code lang-c" data-lang="c" data-unlink=""><span class="synComment">/* file name : main.c */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;bcm_host.h&gt;</span>		<span class="synComment">/* required to use bcm_host_get_peripheral_address() */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;fcntl.h&gt;</span>		<span class="synComment">/* required to use open(), close(), usleep() */</span>
<span class="synPreProc">#include </span><span class="synConstant">&lt;sys/mman.h&gt;</span>		<span class="synComment">/* required to use mmap(), munmap() */</span>
<span class="synPreProc">#define BLOCK_SIZE	(</span><span class="synConstant">4096</span><span class="synPreProc">)			</span><span class="synComment">/* マッピングするメモリサイズ(4KByte) */</span>
<span class="synPreProc">#define	GPIO_OFFSET	(</span><span class="synConstant">0x00200000</span><span class="synPreProc">)		</span><span class="synComment">/* see p.91 of dataseet		*/</span>
<span class="synPreProc">#define	GPFSEL0		(</span><span class="synConstant">0x00</span><span class="synPreProc">)			</span><span class="synComment">/* GPFSEL0 Address下位1byte	*/</span>
<span class="synPreProc">#define	GPSET0		(</span><span class="synConstant">0x1c</span><span class="synPreProc">)			</span><span class="synComment">/* GPFSET0 Address下位1byte	*/</span>
<span class="synPreProc">#define	GPCLR0		(</span><span class="synConstant">0x28</span><span class="synPreProc">)			</span><span class="synComment">/* GPFCLR0 Address下位1byte	*/</span>
<span class="synType">int</span> main( <span class="synType">void</span> )
{
<span class="synType">volatile</span>	<span class="synType">unsigned</span> <span class="synType">int</span> *gpio;
<span class="synType">void</span> *map;
<span class="synType">int</span> fd;
<span class="synType">int</span> adr_gpio_base;
<span class="synType">int</span> i = <span class="synConstant">0</span>;
<span class="synComment">/*==========================================================*/</span>
<span class="synComment">/* GPIO制御レジスタ・アドレスを取得し、map変数に代入する	*/</span>
<span class="synComment">/*==========================================================*/</span>
fd = open( <span class="synConstant">"/dev/mem"</span>, (O_RDWR | O_SYNC) );
<span class="synComment">/* open()エラー処理割愛 */</span>
;
<span class="synComment">/*------------------------------------------------------------------------------------------*/</span>
<span class="synComment">/* refer to									*/</span>
<span class="synComment">/* https://www.raspberrypi.org/documentation/hardware/raspberrypi/peripheral_addresses.md*/</span>
<span class="synComment">/*											*/</span>
<span class="synComment">/* ペリフェラル物理アドレスがラズパイ世代で異なる為、互換性を持たせる為に			*/</span>
<span class="synComment">/* bcm_host_get_peripheral_address()でプログラム実行マシンの上の物理アドレスを取得する	*/</span>
<span class="synComment">/*------------------------------------------------------------------------------------------*/</span>
adr_gpio_base = bcm_host_get_peripheral_address();
<span class="synComment">/* mapにペリフェラル物理アドレスをマッピング */</span>
map = mmap( <span class="synConstant">NULL</span>,
BLOCK_SIZE,
PROT_WRITE,
MAP_SHARED,
fd,
(adr_gpio_base + GPIO_OFFSET) );
<span class="synComment">/* mmap()エラー処理割愛 */</span>
;
close( fd );
<span class="synComment">/*==========================================================*/</span>
<span class="synComment">/* GPIO 2pin 初期設定					*/</span>
<span class="synComment">/*==========================================================*/</span>
gpio = (<span class="synType">unsigned</span> <span class="synType">int</span> *)map;
gpio[GPFSEL0/<span class="synConstant">4</span>]	|= <span class="synConstant">0x00000040</span>;
gpio[GPCLR0/<span class="synConstant">4</span>]	|= <span class="synConstant">0x00000002</span>;
usleep( <span class="synConstant">500000</span> );
<span class="synComment">/*==========================================================*/</span>
<span class="synComment">/* LED点滅処理						*/</span>
<span class="synComment">/*==========================================================*/</span>
<span class="synStatement">while</span> (i &lt; <span class="synConstant">5</span> ){
gpio[GPSET0/<span class="synConstant">4</span>]	|= <span class="synConstant">0x00000002</span>;
usleep( <span class="synConstant">250000</span> );
gpio[GPCLR0/<span class="synConstant">4</span>]	|= <span class="synConstant">0x00000002</span>;
usleep( <span class="synConstant">250000</span> );
i++;
}
gpio[GPFSEL0/<span class="synConstant">4</span>]	&amp;= <span class="synConstant">0xfffffffb</span>; <span class="synComment">/* INPUTに戻す(無くても良い処理) */</span>
munmap( map, BLOCK_SIZE );
<span class="synStatement">return</span> <span class="synConstant">0</span>;
}
</pre>
<p>最低限の処理だけ書いた為、エラー発生時にどうするか等の処理は割愛しています。</p>
</div>
<div class="section">
<h3 id="プログラムの説明"><span id="toc4">プログラムの説明</span></h3>
<p>前回のpythonで実行させた時と同じく、GPIO 2番ピンを使っています。</p>
<p>プログラムの内容は、</p>
<ol>
<li>GPIO制御レジスタのアドレスを取得 (bcm_host_get_peripheral_address())</li>
<li>map変数を介して、GPIO制御レジスタにアクセスできるようにする</li>
<li>GPIO 2pinを出力設定にする (gpio[GPFSEL0/4] |= 0x00000040)</li>
<li>GPIO 2pin の出力をLO出力してLEDを消灯 (gpio[GPCLR0/4] |= 0x00000002)</li>
<li>500ミリ秒ウェイト(usleep)</li>
<li>GPIO 2pin の出力HI出力してLEDを点灯 (gpio[GPSET0/4] |= 0x00000002)</li>
<li>250ミリ秒ウェイト(usleep)</li>
<li>GPIO 2pin の出力をLO出力してLEDを消灯 (gpio[GPCLR0/4] |= 0x00000002)</li>
<li>250ミリ秒ウェイト(usleep)</li>
<li>上記を5回繰り返す (while (i &lt; 5 ))</li>
</ol>
<p>となっています。</p>
<p>前回のpythonのソースコードと比較すると、何をしているのかサッパリわからないと思います。<br />
また、今回のソースコードは必要最小限のライブラリしか使用していない為、C言語を理解している人でも、デバイスの制御仕様を理解しないと意味がわかりません。</p>
<p>GPIOの制御仕様(データシート)はラズパイ公式サイトから入手できます。<br />
<a rel="noopener" target="_blank" href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf">https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf<span class="fa fa-external-link external-icon anchor-icon"></span></a><br />
(<a rel="noopener" target="_blank" href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/datasheets.md">Raspberry Pi Documentation<span class="fa fa-external-link external-icon anchor-icon"></span></a> より)<br />
p.89の「6 General Purpose I/O (GPIO)」の仕様を読みソースコードを書きました。<br />
この項を読むとソースコードが何をやっているのかわかるので、C言語を知っている方は次回の説明までにソース解析に是非挑戦してみて下さい。</p>
</div>
<div class="section">
<h3 id="プログラムの実行方法"><span id="toc5">プログラムの実行方法</span></h3>
<pre class="code lang-sh" data-lang="sh" data-unlink="">$ gcc main.c <span class="synSpecial">-I</span>/opt/vc/include <span class="synSpecial">-L</span>/opt/vc/lib <span class="synSpecial">-lbcm_host</span>
$ sudo ./a.out
</pre>
<p>gccコンパイラでmain.cをコンパイルします。<br />
上述の通り、コンパイル→アセンブル→リンクまで行います。</p>
<p>今回のプログラムはbcm_hostライブラリを使用しているので、この機能をプログラムに組み込む(＝リンクさせる)為に、-lオプションでbcm_hostライブラリの場所を指定しています。<br />
このオプションを付けずにgccを走らせると、リンカーがbcm_hostライブラリの所在がわからず、実行ファイルにライブラリを結合する事ができないエラーが発生します。</p>
<p>プログラム実行は&#8221;./a.out&#8221;と入力してENTERを押せば良いのですが、メモリ・アクセスには特権レベル(スーパー・ユーザー)が必要な為、sudoコマンドでa.outを特権レベルで実行させます。特権レベルが無いと、OSがメモリ保護を行っており、与えられたメモリ空間外へのアクセスを禁止している為です。<br />
sudo をつけなかった場合、メモリ・アクセスができずにエラーでプログラムは動作しません。</p>
</div>
<div class="section">
<h3 id="プログラムの実行結果"><span id="toc6">プログラムの実行結果</span></h3>
<div align="center">
<p>&nbsp;</p>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja">
<p dir="ltr" lang="ja">グローバルIP監視やWi-Fiアクセスポイントにして遊んでたラズパイ。<br />
この前LED買ったからLチカさせた。C言語。 <a rel="noopener" target="_blank" href="https://t.co/Tgf2bYeEXH">pic.twitter.com/Tgf2bYeEXH<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p>— Initial JJ (@initial_jj) <a rel="noopener" target="_blank" href="https://twitter.com/initial_jj/status/1303128669326462976?ref_src=twsrc%5Etfw">2020年9月8日<span class="fa fa-external-link external-icon anchor-icon"></span></a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
</div>
<p>&nbsp;</p>
<p>ご覧いただき、ありがとうございました。<br />
ランキングに参加しています。<span style="color: #0000cc;">ポチッと押して去って頂けると、<strong>次回に続く</strong>。</span></p>
<p><a rel="noopener" target="_blank" href="https://blogmura.com/ranking/in?p_cid=11037140"><img decoding="async" src="https://b.blogmura.com/88_31.gif" alt="ブログランキング・にほんブログ村へ" width="88" height="31" border="0" />にほんブログ村<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p><a rel="noopener" target="_blank" href="https://blog.with2.net/link/?id=2039323"><img decoding="async" title="人気ブログランキング" src="https://blog.with2.net/img/banner/banner_21.gif" /></a><br />
<a rel="noopener" target="_blank" style="font-size: 0.9em;" href="https://blog.with2.net/link/?id=2039323">人気ブログランキング<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
</div>
</div><p>The post <a href="https://initial-jj.com/entry/2020/09/12/howto_embbeded/">絶対にわかる組み込みソフトウェア 2: C言語でLED点灯(Lチカ)制御</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://initial-jj.com/entry/2020/09/12/howto_embbeded/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2267</post-id>	</item>
		<item>
		<title>絶対にわかる組み込みソフトウェア 1: pythonでLED点灯制御</title>
		<link>https://initial-jj.com/entry/2020/09/09/howto_embbeded/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=2020-09-09-howto_embbeded</link>
					<comments>https://initial-jj.com/entry/2020/09/09/howto_embbeded/#respond</comments>
		
		<dc:creator><![CDATA[Initial_JJ]]></dc:creator>
		<pubDate>Wed, 09 Sep 2020 12:10:00 +0000</pubDate>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ＰＣ・ソフトウェア]]></category>
		<guid isPermaLink="false">https://initial-jj.com/entry/2020-09-09-howto_embbeded/</guid>

					<description><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解するシリーズ第２回。 プログラミングの楽しさがわかるよ ラズパイにLEDを繋ぎ、python(パイソン)で書いたプログラムでLEDを点灯・消灯さ [&#8230;]</p>
<p>The post <a href="https://initial-jj.com/entry/2020/09/09/howto_embbeded/">絶対にわかる組み込みソフトウェア 1: pythonでLED点灯制御</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解するシリーズ第２回。</p>
<figure class="figure-image figure-image-fotolife" title="プログラミングの楽しさがわかるよ"><img decoding="async" class="hatena-fotolife" title="f:id:initial_jj:20200908085339j:plain" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200908085339.jpg" alt="Raspberry Pi 2 Model B ラズパイ" /><figcaption>プログラミングの楽しさがわかるよ</figcaption></figure>
<p>ラズパイにLEDを繋ぎ、python(パイソン)で書いたプログラムでLEDを点灯・消灯させてみます。通称「Ｌチカ」と呼ばれているようです。</p>
<div align="center">
<p>&nbsp;</p>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja">
<p dir="ltr" lang="ja">ラズパイ、初めてpython使ってみた<br />
お勉強用のお手軽さは認めるが、何かコレジャナイ感が強い <a rel="noopener" target="_blank" href="https://t.co/QbZvU7kXjB">pic.twitter.com/QbZvU7kXjB<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p>— Initial JJ (@initial_jj) <a rel="noopener" target="_blank" href="https://twitter.com/initial_jj/status/1303521647660396545?ref_src=twsrc%5Etfw">2020年9月9日<span class="fa fa-external-link external-icon anchor-icon"></span></a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
</div>
<p><span style="color: #0000cc;">今回はプログラムと制御するハードウェアの説明、また、プログラミング言語について基礎知識が深まるよう説明を進めます。</span><br />
序章はコチラ。<br />
<iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="誰でもわかる組み込みソフトウェア 序: なぜ機械が動くのか？ - 鬱リーマン、株式投資とパチスロと不毛な日々" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finitial-jj.com%2Fentry%2F2020%2F09%2F08%2Fhowto_embbeded" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://initial-jj.com/entry/2020/09/08/howto_embbeded">www.initial-jj.com</a></cite><br />
Linuxや組み込みソフトウェアで遊んでみたい方は、下記キットがオススメです。</p>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品","b":"Raspberry Pi","t":"Raspberry Pi 4 Model B 4GB","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51opPFsZz2L.jpg","\/51Mjj4Wr2pL.jpg","\/51JO5QS330L.jpg","\/41GK9ou44ZL._SL500_.jpg","\/41NxsmH2JoL.jpg","\/51eNI-V65gL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081YD3VL5","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"DsKTy","s":"s"});</script></p>
<div id="msmaflink-DsKTy">リンク</div>
</div>
<div align="center">
<p><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink");msmaflink({"n":"KeeYees 電子工作キット 初心者向け スターターキット 電子部品 基本部品56種類 エレクトロニクス入門キット Electronics Fun Kit Arduino用 Raspberry Pi用 チュートリアルあり","b":"KeeYees","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/61vRPie6ipL.jpg","\/51Hi9QvkE1L.jpg","\/51qm5-evtaL.jpg","\/51IeuuuSTiL.jpg","\/51TVYt5gU7L.jpg","\/51dzzPesGML.jpg","\/51M0VmYHKYL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081F7FNR7","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"X5Exd","s":"s"});</script></p>
<div id="msmaflink-X5Exd">リンク</div>
</div>
<div class="section">

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">プログラミング言語について</a><ol><ol><li><a href="#toc2" tabindex="0">インタープリタ型とは</a></li><li><a href="#toc3" tabindex="0">コンパイラ型とは</a></li></ol></li></ol></li><li><a href="#toc4" tabindex="0">プログラム説明</a><ol><li><a href="#toc5" tabindex="0">ソースコード</a></li><li><a href="#toc6" tabindex="0">プログラムの説明</a></li><li><a href="#toc7" tabindex="0">プログラムの実行方法</a></li><li><a href="#toc8" tabindex="0">プログラムの実行結果</a></li></ol></li></ol>
    </div>
  </div>

<h2 id="プログラミング言語について"><span id="toc1">プログラミング言語について</span></h2>
<p>プログラミング言語は多種多様あります。BASIC, C, C++, Java, Perl, Ruby, COBOL, FORTLAN, Pascal etc.<br />
その中でpythonという言語があります。</p>
<p>プログラム作成方式には大きく２種類あり、インタープリタ型とコンパイラ型に分類されます。<br />
コンピュータを動かすプログラムは、最終的には「０と１」の組み合わせで表現され、これをマシン語(機械語)と言います。<br />
ですが、人間が最初から「０と１」を組み合わせたマシン語を書く事は不可能です。<br />
<span style="font-size: 80%;"><span style="color: #0000cc;">余談ですが、８０年代前半はＣＰＵも処理も今よりも簡単だった為、プログラムを書かずに直接マシン語を書ける人もいました。特殊技能ですが。</span></span><br />
そこで、人間が理解できるプログラミング言語が次々と開発され、これらの書式に則りプログラムを書き、コンピュータ(ＣＰＵ)が理解できるマシン語に変換、実行させます。</p>
<div align="center"><img decoding="async" class="hatena-fotolife" title="f:id:initial_jj:20200908085856j:plain" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200908085856.jpg" alt="f:id:initial_jj:20200908085856j:plain" /></div>
<p>今回紹介するpythonは、インタープリタ型のプログラミング言語です。</p>
<div class="section">
<h4 id="インタープリタ型とは"><span id="toc2">インタープリタ型とは</span></h4>
<p>インタープリタ型とは、コンピュータがプログラムを逐次解釈しながら実行する方式の事です。<br />
インタープリタはソースコードの１行目から順に、ＣＰＵが理解できる形式に変換しながらプログラムを実行します。<br />
従って、仮に１００行のソースコードを書いたとしてその８０行目にエラーが存在した場合、７９行目まで処理が進みますが、８０行目でエラーが発生してプログラムの実行は終了します。</p>
<p>インタープリタ型のメリットは、プログラムが完成していなくても実行できる点です。<br />
デメリットは、逐次解釈する為、処理速度が遅い事です。<br />
例えば３Ｄゲームは非常に複雑な演算をしています。視点、光源設定、テクスチャマッピング等、オブジェクトを描画する為に高度な演算を繰り返してリアルな画像を描画しています。このようなプログラムを１行ずつ解釈して実行した場合、処理が遅い為にスムースに表示できず、画面がカクついてゲームになりません。<br />
高速処理を求められるソフトウェアや、ハードウェアの性能を引き出すソフトウェアは、後述のコンパイラ型でプログラム作成されます。</p>
</div>
<div class="section">
<h4 id="コンパイラ型とは"><span id="toc3">コンパイラ型とは</span></h4>
<p>コンパイラと呼ばれるツールがソースコードを翻訳し、コンピュータが実行できる形式(実行ファイル)を生成する方式です。<br />
コンパイラにソースコードを読ませると、マシン語に近いアセンブリ言語に変換されます。<br />
次に、アセンブラというツールがアセンブリ言語を翻訳し、オブジェクト・ファイルを生成します。<br />
最後に、リンカーというツールがオブジェクト・ファイルを結合して、実行形式ファイルを生成します。</p>
<p>コンパイラ型のメリットは、実行ファイルが高速動作する点です。<br />
デメリットは、全てのソースコードからエラーが無くなるまでプログラムを実行できない事です。途中まで作ったから、そこまでのテストをしよう、という事はできません。</p>
</div>
</div>
<div class="section">
<h2 id="プログラム説明"><span id="toc4">プログラム説明</span></h2>
<div class="section">
<h3 id="ソースコード"><span id="toc5">ソースコード</span></h3>
<pre class="code lang-python" data-lang="python" data-unlink=""><span class="synComment"># filename : lblink.py</span>
<span class="synPreProc">import</span> RPi.GPIO <span class="synStatement">as</span> GPIO
<span class="synPreProc">import</span> time
GPIO.setmode( GPIO.BCM )
GPIO.setup( <span class="synConstant">2</span>, GPIO.OUT )
<span class="synStatement">for</span> x <span class="synStatement">in</span> <span class="synIdentifier">xrange</span>( <span class="synConstant">5</span> ):
GPIO.output( <span class="synConstant">2</span>, <span class="synIdentifier">True</span> )
time.sleep( <span class="synConstant">0.5</span> )
GPIO.output( <span class="synConstant">2</span>, <span class="synIdentifier">False</span> )
time.sleep( <span class="synConstant">0.5</span> )
GPIO.cleanup()
</pre>
</div>
<div class="section">
<h3 id="プログラムの説明"><span id="toc6">プログラムの説明</span></h3>
<p>GPIO(General Purpose Input/Output)の略で「汎用入出力」というピンを制御します。</p>
<p>プログラムの内容は、</p>
<ol>
<li>GPIO 2pinを出力設定にする (GPIO.setup())</li>
<li>GPIO 2pin の出力ON(HI出力)してLEDを点灯</li>
<li>0.5秒ウェイト(sleep)</li>
<li>GPIO 2pin の出力をOFF(LO出力)してLEDを消灯</li>
<li>0.5秒ウェイト(sleep)</li>
<li>上記を5回繰り返す (for x in xrange( 5 ))</li>
</ol>
<p>となっています。<br />
プログラムを全く知らない方でも、何となくわかって頂けるのではないかと思います。<br />
pythonはライブラリが豊富に揃っているのでimport で使いたい機能を宣言し、あとは用意されているAPIを使うだけです。<br />
これがpythonの気軽さであり、学習用と言われる所以です。</p>
<p>今回はGPIO 2pinを使いました。<br />
GPIOの仕様(＝説明書)を理解しないと制御ができないので、多少は調べる必要があります。<br />
ここにラズパイのGPIO仕様がありました。</p>
<p><img decoding="async" src="https://www.raspberrypi.com/documentation/computers/images/GPIO-Pinout-Diagram-2.png" alt="GPIO pins" /><br />
<img decoding="async" src="https://www.raspberrypi.com/documentation/computers/images/GPIO.png" /><br />
<a rel="noopener" target="_blank" href="https://www.raspberrypi.com/documentation/computers/os.html#gpio-pinout">GPIO &#8211; Raspberry Pi Documentation<span class="fa fa-external-link external-icon anchor-icon"></span></a> より<br />
LEDを駆動するだけなので、電圧は3.3V pinから取ればＯＫです。抵抗は470Ωを繋いでいます。<br />
抵抗無しでもLEDは点灯しますが、電流が流れすぎるとLED寿命が縮まるので、電流値を下げる為に挟んでいます。</p>
<p>GPIOは何番pinを使っても構いませんが、今回は2番pinを使いました。<br />
わかりにくいですが、白を2番pin、黒をGND(グランド)と接続しています。</p>
<figure class="figure-image figure-image-fotolife" title="白(2pin)、黒(13pin(GND)"><img decoding="async" class="hatena-fotolife" title="f:id:initial_jj:20200909203918j:plain" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200909203918.jpg" alt="ラズパイ GPIO Lチカ" /><figcaption>白(2pin)、黒(13pin(GND)</figcaption></figure>
<figure class="figure-image figure-image-fotolife" title="ブレッドボードのLED配線"><img decoding="async" class="hatena-fotolife" title="f:id:initial_jj:20200909194118j:plain" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200909194118.jpg" alt="ラズパイ Lチカ ブレッドボード" /><figcaption>ブレッドボードのLED配線</figcaption></figure>
<p>2pinは GPIO2(SDA)と書かれています。<br />
これは、汎用入出力pin以外にハードウェアが持っている機能の１つ、SDAの端子として使えるpinである事を意味しています。<br />
SDAとはI2C通信(「アイスクエアシー」や「アイツーシー」と読む)に使う信号線の１本です。<br />
Fritzingという回路図作成ツールを使い、配線を図示しましたので参考にして下さい。</p>
<figure class="figure-image figure-image-fotolife" title="Lチカ 配線図"><img decoding="async" class="hatena-fotolife" title="f:id:initial_jj:20201017133101j:plain" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20201017133101.jpg" alt="ラズパイ Lチカ 配線図 回路図 Fritzing" /><figcaption>Lチカ 配線図</figcaption></figure>
<p>GPIOについては次回詳細説明をする予定ですが、制御仕様(データシート)はラズパイ公式サイトから入手できます。<br />
<a rel="noopener" target="_blank" href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf">https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf<span class="fa fa-external-link external-icon anchor-icon"></span></a><br />
(<a rel="noopener" target="_blank" href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/datasheets.md">Raspberry Pi Documentation<span class="fa fa-external-link external-icon anchor-icon"></span></a> より)<br />
pythonでプログラミングする場合、GPIO制御もライブラリが用意されているので、データシートを読む必要は無く、GPIO出力pin配置だけ調べればプログラムが書けます。プログラミングの楽しさを知るには丁度良い言語だと思います。<br />
そして、これが前回の序文で話したソフトウェアの「上位側」にあたるプログラムです。<br />
デバイスの制御はGPIO.*() という命令文を使うだけでできてしまいます。デバイスの制御方法を知らなくても数行のソースコードでＬチカを実現できます。</p>
</div>
<div class="section">
<h3 id="プログラムの実行方法"><span id="toc7">プログラムの実行方法</span></h3>
<p>ターミナルでpythonを実行。</p>
<pre class="code lang-sh" data-lang="sh" data-unlink="">$ python lblink.py
</pre>
</div>
<div class="section">
<h3 id="プログラムの実行結果"><span id="toc8">プログラムの実行結果</span></h3>
<div align="center">
<p>&nbsp;</p>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja">
<p dir="ltr" lang="ja">ラズパイ、初めてpython使ってみた<br />
お勉強用のお手軽さは認めるが、何かコレジャナイ感が強い <a rel="noopener" target="_blank" href="https://t.co/QbZvU7kXjB">pic.twitter.com/QbZvU7kXjB<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p>— Initial JJ (@initial_jj) <a rel="noopener" target="_blank" href="https://twitter.com/initial_jj/status/1303521647660396545?ref_src=twsrc%5Etfw">2020年9月9日<span class="fa fa-external-link external-icon anchor-icon"></span></a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
</div>
<p>次回は、ＬチカをＣ言語で実装してみようと思います。<br />
Ｃ言語で書く場合、データシートを理解しないと実装できません。ライブラリの使用は最低限に抑え、どのようにデバイス制御を行うのかにフォーカスを当てたいと思います。</p>
<p>ご覧いただき、ありがとうございました。<br />
ランキングに参加しています。<span style="color: #0000cc;">ポチッと押して去って頂けると、<strong>私のビビリ症が治る気がします</strong>。</span><br />
<a rel="noopener" target="_blank" href="https://blogmura.com/ranking/in?p_cid=11037140"><img decoding="async" src="https://b.blogmura.com/88_31.gif" alt="ブログランキング・にほんブログ村へ" width="88" height="31" border="0" />にほんブログ村<span class="fa fa-external-link external-icon anchor-icon"></span></a><br />
<a rel="noopener" target="_blank" href="https://blog.with2.net/link/?id=2039323"><img decoding="async" title="人気ブログランキング" src="https://blog.with2.net/img/banner/banner_21.gif" /></a><br />
<a rel="noopener" target="_blank" style="font-size: 0.9em;" href="https://blog.with2.net/link/?id=2039323">人気ブログランキング<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
</div>
</div><p>The post <a href="https://initial-jj.com/entry/2020/09/09/howto_embbeded/">絶対にわかる組み込みソフトウェア 1: pythonでLED点灯制御</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://initial-jj.com/entry/2020/09/09/howto_embbeded/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2271</post-id>	</item>
		<item>
		<title>絶対にわかる組み込みソフトウェア 序: なぜ機械が動くのか？</title>
		<link>https://initial-jj.com/entry/2020/09/08/howto_embbeded/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=2020-09-08-howto_embbeded</link>
					<comments>https://initial-jj.com/entry/2020/09/08/howto_embbeded/#respond</comments>
		
		<dc:creator><![CDATA[Initial_JJ]]></dc:creator>
		<pubDate>Tue, 08 Sep 2020 07:30:00 +0000</pubDate>
				<category><![CDATA[組み込みソフトウェア]]></category>
		<category><![CDATA[ＰＣ・ソフトウェア]]></category>
		<guid isPermaLink="false">https://initial-jj.com/entry/2020-09-08-howto_embbeded/</guid>

					<description><![CDATA[<p>今回は、ＩＴ系ってナニ？ソフトウェアってナニ？という方に向けて組み込みソフトウェアの事を題材にしたいと思います。 Raspberry Pi(ラズベリーパイ) という学習＆趣味用の超廉価PCがあります。これを使って、ゼロか [&#8230;]</p>
<p>The post <a href="https://initial-jj.com/entry/2020/09/08/howto_embbeded/">絶対にわかる組み込みソフトウェア 序: なぜ機械が動くのか？</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>今回は、ＩＴ系ってナニ？ソフトウェアってナニ？という方に向けて組み込みソフトウェアの事を題材にしたいと思います。</p>
<p>Raspberry Pi(ラズベリーパイ) という学習＆趣味用の超廉価PCがあります。これを使って、ゼロからプログラミングを習得する方法について書きます。</p>
<figure class="figure-image figure-image-fotolife mceNonEditable" title="Raspberry Pi 2 Model B"><img decoding="async" class="hatena-fotolife" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200908085339.jpg" alt="Raspberry Pi 2 Model B ラズパイ" /><figcaption class="mceEditable">Raspberry Pi 2 Model B</figcaption></figure>

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Raspberry Pi</a></li><li><a href="#toc2" tabindex="0">組み込みソフトウェアとは？</a><ol><li><a href="#toc3" tabindex="0">ソフトウェア</a></li><li><a href="#toc4" tabindex="0">組み込みソフトウェア</a></li></ol></li><li><a href="#toc5" tabindex="0">この記事の目的</a></li></ol>
    </div>
  </div>

<h2 id="Raspberry-Pi"><span id="toc1">Raspberry Pi</span></h2>
<p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="Raspberry Pi - Wikipedia" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fja.wikipedia.org%2Fwiki%2FRaspberry_Pi" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a rel="noopener" target="_blank" href="https://ja.wikipedia.org/wiki/Raspberry_Pi">ja.wikipedia.org<span class="fa fa-external-link external-icon anchor-icon"></span></a></cite></p>
<p>ラズベリーパイ、通称ラズパイ。２０１３年に初代が発売されました。</p>
<p>ＡＲＭプロセッサを搭載しており、USB、Wi-Fi、Bluetooth、HDMI出力機能等を持っており、パソコン同等のハードウェア性能を持っています。</p>
<p>ラズパイ単体では何もできませんが、それはWindows PCも同じ。ソフトウェア(OS)を載せる事でパソコンとして使えるようになります。</p>
<div align="center"><script type="text/javascript">// <![CDATA[ (function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a; b[a]=b[a]||function(){arguments.currentScript=c.currentScript ||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)}; c.getElementById(a)||(d=c.createElement(f),d.src=g, d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))}) (window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink"); msmaflink({"n":"【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品","b":"Raspberry Pi","t":"Raspberry Pi 4 Model B 4GB","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51opPFsZz2L.jpg","\/51JO5QS330L.jpg","\/51Mjj4Wr2pL.jpg","\/41NxsmH2JoL.jpg","\/41GK9ou44ZL._SL500_.jpg","\/51eNI-V65gL.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081YD3VL5","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"uZc5z","s":"s"}); // ]]&gt;</script></p>
<div id="msmaflink-uZc5z">リンク</div>
</div>
<div align="center"><script type="text/javascript">// <![CDATA[ (function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a; b[a]=b[a]||function(){arguments.currentScript=c.currentScript ||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)}; c.getElementById(a)||(d=c.createElement(f),d.src=g, d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))}) (window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js","msmaflink"); msmaflink({"n":"KeeYees 電子工作キット 初心者向け スターターキット 電子部品 基本部品56種類 エレクトロニクス入門キット Electronics Fun Kit Arduino用 Raspberry Pi用 チュートリアルあり","b":"KeeYees","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/61vRPie6ipL.jpg","\/51M0VmYHKYL.jpg","\/51dzzPesGML.jpg","\/51IeuuuSTiL.jpg","\/51qm5-evtaL.jpg","\/51TVYt5gU7L.jpg","\/51Hi9QvkE1L.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B081F7FNR7","t":"amazon","r_v":""},"aid":{"amazon":"1764663","rakuten":"1764261"},"eid":"X5yxN","s":"s"}); // ]]&gt;</script></p>
<div id="msmaflink-X5yxN">リンク</div>
</div>
<p>ラズパイのOSは主にLinux(リナックス) です。Windowsも載せる事ができますが、Win 10とは別物なので、わざわざ載せるメリットは少ない為、Linux(RaspbianやUbuntu)を載せて使う人が多いと思います。</p>
<p>Linux OSは一般には聞き馴染みがないかもしれませんが、Unix互換のOSです。外国人と会議で話す時はライナックスと発音される場合があるので、ついでに覚えておくと役立つ事があるかもしれません。</p>
<p>オフィスではサーバー用途でLinux PCが使われている場合があり、また、組み込みLinuxと呼ばれるディストリビューションはＴＶやカーナビ等に採用されています。スマホやタブレットでお馴染みのAndroid OSは、Linuxカーネルを使用しており、今では身の回りにある電子機器に搭載されている一般的なOSの１種となっています。</p>
<h2 id="組み込みソフトウェアとは"><span id="toc2">組み込みソフトウェアとは？</span></h2>
<p>ソフトウェアと言う言葉は知っていても「組み込みソフトウェア」というのは聞き慣れない言葉だと思います。</p>
<div align="center"><img decoding="async" class="hatena-fotolife" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200908085856.jpg" alt="バイナリ" /></div>
<h3 id="ソフトウェア"><span id="toc3">ソフトウェア</span></h3>
<p>ソフトウェアとは、ハードウェア(機械) に対してどのように動くか命令するものです。ハードウェアだけがあっても、それを電源に繋いでも何も動きません。(アナログ回路やＡＳＩＣをメインにした回路は除外。)</p>
<p>例えばＰＣの場合は、WindowsはMac OS、LinuxといったOS(基本ソフト)を導入する事で各種ハードウェア(映像を出す、音を出すetc.) と言った機能を使えるようにしてくれます。</p>
<p>ですが、OSだけ載っていても、ユーザーが音楽を作ったり絵を描いたりする事はできません。それらを実現する為にはソフトウェアが必要となります。Word / Excel / Photoshop / Chrome / Edge / Vi / Emacs等のソフトウェアがある事で、ＰＣを使って様々な事ができるようになります。</p>
<div align="center"><img decoding="async" class="hatena-fotolife" title="" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200908090228.jpg" alt="" /></div>
<h3 id="組み込みソフトウェア"><span id="toc4">組み込みソフトウェア</span></h3>
<p><a rel="noopener" target="_blank" href="https://ja.wikipedia.org/wiki/%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0">組み込みシステム &#8211; Wikipedia<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p>身の回りにあるもの、スマホ、デジタル時計、炊飯器、カーナビ、パチンコ、ＴＶ、ゲーム機など、全ての電子機器にハードウェアを制御するソフトウェアが搭載されています。</p>
<p>組み込みソフトウェアとは、特定の機器を制御させる為のソフトウェアの事です。</p>
<p>下記は、ラズパイにLEDを接続して、プログラム(Ｃ言語)でLEDを点滅制御させたものです。</p>
<div align="center">
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja">
<p dir="ltr" lang="ja">グローバルIP監視やWi-Fiアクセスポイントにして遊んでたラズパイ。<br />
この前LED買ったからLチカさせた。C言語。 <a rel="noopener" target="_blank" href="https://t.co/Tgf2bYeEXH">pic.twitter.com/Tgf2bYeEXH<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
<p>— Initial JJ (@initial_jj) <a rel="noopener" target="_blank" href="https://twitter.com/initial_jj/status/1303128669326462976?ref_src=twsrc%5Etfw">2020年9月8日<span class="fa fa-external-link external-icon anchor-icon"></span></a></p></blockquote>
<p><script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
</div>
<p>再びWindows PCを例にしますが、世界中のメーカーがWindows PCを製造していますが、全てWindowsというOSを搭載する事ができます。CPU / メモリ / HDD / 光学ドライブ / 出力モニターの解像度等、あらゆる部品が異なるのにWindowsの画面が出て、キーボードやマウスが使えます。</p>
<p>それはなぜか？</p>
<p>「下回り」と呼ばれる、ハードウェア(ＩＣ)を制御するプログラム(ソフトウェア)があり、セット毎に適したソフトウェアを用いて動作する仕組みがあるからです。</p>
<p>ＰＣに新しい機器(HDDやiPhone etc.) を初回接続した際、「ドライバー」がインストールされます。これが、特定の機器(≒ＩＣ)を制御できるようにする為のソフトウェアです。</p>
<p>上位側のアプリケーション(Word / Excel等) は、ハードウェアの差異を意識する事なくプログラムが書かれており、ＩＣの差異はドライバーが吸収してくれるように構成されています。</p>
<p>これが、ソフトウェアを「上位側」と「下位側(下回り)」に区別する理由です。</p>
<p>スマホやＰＣのアプリ、ゲームは<span style="color: #0000cc;">組み込みソフトとは言いません</span>。これらのアプリケーションは、実行されるハードウェアの差異は下位のソフトウェア(ドライバー) が吸収してくれるので、ハードウェアの知識がなくてもプログラムが書けます。<span style="color: #0000cc;">組み込みソフトではなく、主に汎用ソフトウェアと呼ばれます</span>。</p>
<p>この汎用ソフトウェアやＷｅｂデザイナーが、俗にＩＴ系と称されるものです。</p>
<p>これは、組み込みソフトウェアと一括りにする事はできません。</p>
<p>組み込みソフトウェアがあるから、ハードウェアを動かせる。そして、ハードウェアを簡単に制御できるようする為に、ドライバやライブラリを上位層に提供する。上位ソフトはそれらを利用して、ゲーム等のソフトウェアを作る。</p>
<p>ソフトウェアと言っても、上位・下位によって役割や有知識が全く異なります。</p>
<h2 id="この記事の目的"><span id="toc5">この記事の目的</span></h2>
<p>巷にはラズパイやLinuxのプログラムを説明したブログが多く、有知識者にとっては重宝できる情報が手に入りますが、逆にその筋の専門家以外には意味不明で、門前払いな内容とも言えます。</p>
<div align="center"><img decoding="async" class="hatena-fotolife" title="" src="https://initial-jj.com/wp-content/uploads/HatenaBlog/20200908085759.jpg" alt="" /></div>
<p>今回、私は<span style="color: #0000cc;"><strong>文系の方やプログラムを何も知らない方でも「なぜ機械、家電が動いているのか？どうやって制御してるのか？」に興味があれば、その答えを出せる記事を書きたい</strong>と思いました</span>。</p>
<p>近年、<span style="color: #0000cc;">簡単にプログラマーになれる</span>という類のサイトが増えました。</p>
<p>はっきり申し上げて、有名ブロガーが素人に毛も生えていない低レベルの記事で収益化を図るべく情報を発信していたりします。それ程、プログラミングに関心が高まっているという証ですが、プログラミングの世界って敷居が浅いんだな、と肯定的に読む位が丁度良い情報レベルだと思います。</p>
<p>残念ながら、このような情報を知識元にした所で、地力も応用力も身につきません。</p>
<p>反対に、下位層を担う組み込み系エンジニアは引く手あまたです。</p>
<p>上述の通り、デバイスを直接制御する見識が無いとプログラムが作れない、ゼロから作る下位層のデザイナー＆プログラマーだからです。</p>
<p><span style="color: #0000cc;">組み込み系を知っていれば、上位層のソフトウェアはプログラミング言語を覚えれば作れますが、逆は絶対に無理だと断言します</span>。</p>
<p>ソフトウェアを作りたいとして、自分が何を作りたいのかによって進む道が決まりますが、初心者でもわかる組み込み系の導入サイトは非常に少ないです。</p>
<p>そこで、簡単なハードウェア制御プログラムを作り、それを紹介する事で組み込み系の導入、興味を持つきっかけになれば良いなと考え、今回の企画に至りました。</p>
<p>今後、不定期ですがシリーズ化して記事を書こうと思います。組み込み系プログラムの説明を段階を踏んで説明したいと思っています。</p>
<p>今回はその導入として、ハードウェアとソフトウェアの関係、そしてソフトウェアの階層についての話でした。</p>
<p>ご覧いただき、ありがとうございました。</p>
<p>ランキングに参加しています。<span style="color: #0000cc;">ポチッと押して去って頂けると、<strong>親父の血圧が下がる気がします。応援宜しくお願いします！</strong>。</span><br />
<a rel="noopener" target="_blank" href="https://blogmura.com/ranking/in?p_cid=11037140"><img decoding="async" src="https://b.blogmura.com/88_31.gif" alt="ブログランキング・にほんブログ村へ" width="88" height="31" border="0" />にほんブログ村<span class="fa fa-external-link external-icon anchor-icon"></span></a><br />
<a rel="noopener" target="_blank" href="https://blog.with2.net/link/?id=2039323"><img decoding="async" title="人気ブログランキング" src="https://blog.with2.net/img/banner/banner_21.gif" /></a><br />
<a rel="noopener" target="_blank" style="font-size: 0.9em;" href="https://blog.with2.net/link/?id=2039323">人気ブログランキング<span class="fa fa-external-link external-icon anchor-icon"></span></a></p><p>The post <a href="https://initial-jj.com/entry/2020/09/08/howto_embbeded/">絶対にわかる組み込みソフトウェア 序: なぜ機械が動くのか？</a> first appeared on <a href="https://initial-jj.com">鬱リーマン、不毛な日々と時々デイトレ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://initial-jj.com/entry/2020/09/08/howto_embbeded/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2272</post-id>	</item>
	</channel>
</rss>
