いろいろなマイコンでのLチカ比較

電子工作で誰もが最初に通る道，Lチカですが，マイコン間の比較記事がそんなに見つからなかったので，
いろいろなマイコンのいろんなLチカの書き方をまとめてみました．

※写真のLEDは[抵抗入りのLED](http://akizukidenshi.com/catalog/g/gI-12519/)を使っています。
抵抗の入っていないLEDを使う場合は直列に抵抗を入れるのを忘れないようにしてください

## 昔ながらの[PICマイコン](http://akizukidenshi.com/catalog/g/gI-00097/)
![IMG_4780.jpg](https://qiita-image-store.s3.amazonaws.com/0/227015/0f3dfe59-3d0b-ca32-6016-246ddc3ff777.jpeg)

```c
#include <stdio.h>
#include <htc.h> 
#include <pic.h>
#include <pic16f84a.h>
 
#define _XTAL_FREQ 8000000
 
void main( void )
{
    __CONFIG ( FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF );
    TRISB = 0x00;
 
    while ( 1 ) {
        PORTB = 0x01;
        __delay_ms(500); 
 
        PORTB = 0x00;
        __delay_ms(500); 
    }
}
```

初期からあるマイコン．自分で回路を作ってはんだ付けをして，それで初めてプログラムができるという状態だったので，Lチカできたときの達成感がかなりありました

プログラムとしてはC言語で，メモリに操作でピンの状態を変更します
（XXX番地のメモリを1に書き換えたら5V出力する，など）


## 電子回路入門のハードルを下げた[Arduino](https://www.arduino.cc)
![IMG_4771.JPG](https://qiita-image-store.s3.amazonaws.com/0/227015/3874c5c5-2327-05c9-aa05-3ec5d3f819e7.jpeg)

```c
int LED = 13;

void setup() {
  pinMode(LED,OUTPUT);
}

void loop() {
    digitalWrite(LED,HIGH);
    delay(500)
    digitalWrite(LED,LOW);
    delay(500)
}
```

回路を作らないで，いきなりプログラムがかけるようになったマイコン．
setupとloopという関数を初めて（？）導入して，
PICと同じくC言語でかけるが，メモリをいじることはなく，様々な関数を呼ぶことでピンの状態を操作します

## マイコンというよりはPCの[Raspberry Pi](https://www.raspberrypi.org)
![IMG_4773.JPG](https://qiita-image-store.s3.amazonaws.com/0/227015/0d73595c-4013-5c69-b595-3d2d5d643d55.jpeg)

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import RPi.GPIO as GPIO
from time import sleep
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(3, GPIO.OUT)
 
while True:
    GPIO.output(3, GPIO.HIGH)
    sleep(0.5)
    GPIO.output(3, GPIO.LOW)
    sleep(0.5)
```

マイコンが高機能になったというより，PCにGPIOをつけたようなボード．
ほぼほぼPCなので，どの言語でもかけるが，Pythonで書いているサンプルが多い気がします


## 教育に最適な[Micro:bit](http://microbit.org/ja/guide/)
![スクリーンショット 2018-05-19 15.12.46.png](https://qiita-image-store.s3.amazonaws.com/0/227015/d7a7ac05-c753-0df5-57af-0111a4c9ec4a.png)

![スクリーンショット 2018-05-19 14.07.31.png](https://qiita-image-store.s3.amazonaws.com/0/227015/24ab5d64-1156-42f2-485f-a234c3d23d00.png)
ブロックプログラムができるので，プログラムを触ったことがない人でも使いやすくなっています


Javascriptでも書くことができて，その場合のLチカはこうなります

```javascript
basic.forever(() => {
    led.plot(0, 0)
    basic.pause(500)
    led.unplot(0, 0)
    basic.pause(500)
})

```


## 最近話題の[M5Stack](https://www.switch-science.com/catalog/3647/)
![banner_core.jpg](https://qiita-image-store.s3.amazonaws.com/0/227015/7d69a8b3-91f9-2b0a-5cf9-fe63630f3a32.jpeg)
※写真は[公式サイト](https://www.switch-science.com/catalog/3647/)より

```c
#include <M5Stack.h>

int ledPin = 1;  
int ledState = LOW;

void setup(){
  M5.begin();
  pinMode(ledPin, OUTPUT);  
}

void loop() {

  digitalWrite(ledPin, ledState);
  m5.update();
}
```
ディスプレイとwifiがついたボード．

書き方はArduinoと互換性あり．ほかにもESP-IDFでかいたり，micro Pythonで書いたりすることができます


## UIが簡単に作れる[obniz](https://obniz.io)
![IMG_4770.JPG](https://qiita-image-store.s3.amazonaws.com/0/227015/48056613-4570-9fd1-cde5-d2260b73522c.jpeg)

```html
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@1.2.2/obniz.js"></script>
</head>
<body>

<div id="obniz-debug"></div>
<h1>LED</h1>

<script>
var obniz = new Obniz("OBNIZ_ID_HRERE");
obniz.onconnect = async function () {
  var led = obniz.wired("LED", {anode:0, cathode:1});
 while(1){
   led.on();
   await obniz.wait(500);
   led.off();
   await obniz.wait(500);
  }
};
</script>
</body>
</html>
```

こちらもディスプレイとwifiがついたボード．
言語はHTML（javascript）で，Web上のUIと連携が簡単に作れるのが特徴です


スマホ画面のUIからLチカするとこうなります
![20180519_161106.GIF](https://qiita-image-store.s3.amazonaws.com/0/227015/6b730a3a-c2a5-c2a9-8c00-bc5a9283d50f.gif)
                                   

## （おまけ）物理のLチカ
プログラムを使わない一番シンプルなLチカ
１行もコードを書かないので，とても素早く実装できる！笑
![20180519_151948.GIF](https://qiita-image-store.s3.amazonaws.com/0/227015/1815f835-db39-2187-e715-de5d442614df.gif)