5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DjangoとArduinoを連動したIoT 初学者向け

Last updated at Posted at 2019-05-27

こんにちは、rickyです。
今回はDjangoで作成できる簡単なToDoリストの状態の変化をArduino側で反映させるIoTを作製します。
比較的簡単に実装ができるのでぜひ一度お試し下さい。
対象者は、ArduinoでLチカができるDjangoのチュートリアルを1通り終えている方を対象としています。

完成物としては、ToDoリストに要素がある時は赤いLEDが、要素がないときには青いLEDが点灯するようにします。
配線図はこちらです。
Untitled Sketch_ブレッドボード.jpg

手順としてはまずDjangoのToDoリストのアプリを作製します。
次にArduino側と通信するために必要なモジュールをインポートし要素を表示するためのクラスにシリアル通信のための記述を追加します。
最後にArduino側でLEDの点灯に関する記述を追加するという流れになります。

環境
ubuntu 18.10
Python 3.7.2
Django 2.1.5
Arduino 1.8.8

まずはDjangoで簡単なToDoリストを作製します。
作り方は@morudaraさんのはじめてのDjango Part2 [実践編] ToDoリスト作成
という記事を参考にしました。

次にシリアル通信に必要なモジュールをインポートします。
コマンドからsudo pip3 install PySerialでPython3のserialモジュールをインストールします。
インポートが終わったら、記述をPreview_Todoクラスにシリアル通信のための記述を追加します。

views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse,HttpResponseRedirect
from django.urls import reverse
from .models import Post
from .forms import PostForm
from django.views import View
from django.views.generic.edit import CreateView,DeleteView
import serial,time

class Preview_Todo(View):
    def get(self, req, *args, **kwargs):
        posts = Post.objects.all()
        print(len(posts))
        ser = serial.Serial('/dev/ttyACM0', 9600)
        if len(posts) != 0:
            ser.write(b"0")
            time.sleep(5)
            ser.write(b"1")
        else:
            ser.write(b"2")
            time.sleep(5)
            ser.write(b"3")
        form = PostForm()
        context = {'posts': posts, 'form': form,}
        return render(req, 'todo/index.html', context)
index = Preview_Todo.as_view()

class Create_Todo(CreateView):
    def post(self, req, *args, **kwargs):
        form = PostForm(req.POST)
        form.save(commit=True)
        return HttpResponseRedirect(reverse('index'))
add = Create_Todo.as_view()

class Delete_Todo(DeleteView):
    def delete(self, req, id=None):
        post = get_object_or_404(Post, pk=id)
        post.delete()
        return HttpResponseRedirect(reverse('index'))
delete = Delete_Todo.as_view()

次にArduino側の設定になります。
こちらの記事を参考にしました
コードは以下のようになります。

arduino
void setup() {
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {
  byte var;
  var = Serial.read();

  switch(var){
    case '0':
        digitalWrite(10, LOW);
      break;
    case '1':
        digitalWrite(10, HIGH);
      break;
    case '2':
        digitalWrite(9, LOW);
    case '3':
        digitalWrite(9, HIGH);
    default:
      break;
  }
}

これでToDoリストの要素の有無によってLEDが変わるコードが記述できました。
youtubeに動作している動画を上げておいたので記載しておきます。

感想
Djangoの成果物だけだとありきたりだったので今回LEDと連動させてIoTっぽくしてみました。
Arduinoと連動させるやり方がなかなか見つからず調べるのが大変でしたが、なんとかうまくできました。
ただ問題点として反映されるまでの時間が長いことが挙げられます。
クラスを呼び出す際にシリアル通信を行うために起きる現象だと考えられるのですが、現状改善する方法がわかりません。
またArduino側のコードが冗長に感じられる点も気になりました。
まだまだ技術的に未熟なのでこれらの点やもっとこうした方がいいという点があればご指摘いただけると幸いです。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?