Help us understand the problem. What is going on with this article?

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

こんにちは、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側のコードが冗長に感じられる点も気になりました。
まだまだ技術的に未熟なのでこれらの点やもっとこうした方がいいという点があればご指摘いただけると幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした