Django
Arduino
IoT

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

こんにちは、rickyです。

今回はDjangoで作成できる簡単なToDoリストの状態の変化をArduino側で反映させるIoTを作製します。

比較的簡単に実装ができるのでぜひ一度お試し下さい。

対象者は、ArduinoでLチカができるDjangoのチュートリアルを1通り終えている方を対象としています。

完成物としては、ToDoリストに要素がある時は赤いLEDが、要素がないときには青いLEDが点灯するようにします。

手順としてはまず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側のコードが冗長に感じられる点も気になりました。

まだまだ技術的に未熟なのでこれらの点やもっとこうした方がいいという点があればご指摘いただけると幸いです。