2019年12月30日 星期一

Line機器人實作

參考資料:
手把手教你搭建聊天機器人https://medium.com/@hatsukiotowa/手把手教你搭建聊天機器人-linebot-python-qnamaker-heroku-02建造linebot-backend-server-並部署至heroku-59b36357cd9d

1. 安裝虛擬環境的套件
pip install virtualenvwrapper-win

2.建立虛擬環境
mkvirtualenv nkut

3.安裝Django套件
pip install django

4.建立專案及資料庫初始化
django-admin startproject nkut_bot
cd nkut_bot
python manage.py makemigrations
python manage.py migrate
5.啟動伺服器
python manage.py runserver

6.執行結果
7. 建立bot應用程式
python manage.py startapp bot
8.安裝Line bot sdk套件
pip3 install line-bot-sdk
9.執行IDLE開啟nkut_bot/urls.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
"""nkut_bot URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^bot/', include('bot.urls')),
]

10.新增bot/urls.py

1
2
3
4
5
6
from django.conf.urls import include, url
from . import views
# 用來串接callback主程式
urlpatterns = [
    url('^callback/', views.callback),
]

11. 開啟bot/views.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# import 必要的函式庫
from django.conf import settings
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt

from linebot import LineBotApi, WebhookParser
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextSendMessage
# 這邊是Linebot的授權TOKEN(等等註冊LineDeveloper帳號會取得),我們為DEMO方便暫時存在settings裡面存取,實際上使用的時候記得設成環境變數,不要公開在程式碼裡喔!
line_bot_api = LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(settings.LINE_CHANNEL_SECRET)

@csrf_exempt
def callback(request):

    if request.method == 'POST':
        signature = request.META['HTTP_X_LINE_SIGNATURE']
        body = request.body.decode('utf-8')

        try:
            events = parser.parse(body, signature)
        except InvalidSignatureError:
            return HttpResponseForbidden()
        except LineBotApiError:
            return HttpResponseBadRequest()

        for event in events:
            if isinstance(event, MessageEvent):
                line_bot_api.reply_message(
                    event.reply_token,
                   TextSendMessage(text=event.message.text)
                )
        return HttpResponse()
    else:
        return HttpResponseBadRequest()

12.開啟nkut_bot/settings.py

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"""
Django settings for nkut_bot project.

Generated by 'django-admin startproject' using Django 3.0.1.

For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'u&mk93@4^p6jb*$6d5ew9yu(g@37vp18kib0%n8shr^o-0!zkx'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'nkut_bot.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'nkut_bot.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

STATIC_URL = '/static/'

LINE_CHANNEL_ACCESS_TOKEN = "請填入你剛才在LINE Messaging API的對應值"

LINE_CHANNEL_SECRET = "請填入你剛才在LINE Messaging API的對應值"
請參考 Line developer 取得 LINE_CHANNEL_ACCESS_TOKEN和LINE_CHANNEL_SECRET

14.
pip install django_heroku

15.
pip install gunicorn

16.
pip install dj_static
17.
pip install psycopg2-binary
18.
pip freeze >requirements.txt

19.
heroku create nkutbot
20.
heroku git:remote -a nkutbot


20.
git init
git add .
git config --global user.email "您的Email"
git config --global user.name "您的名字"

21.
git commit -m "initial commit"

22.
heroku config:set DISABLE_COLLECTSTATIC=1

23.
git push heroku master

24.
heroku config:set DJANGO_SETTINGS_MODULE=nkut_bot.production_settings
heroku ps:scale web=1
heroku run python manage.py migrate
heroku run python manage.py createsuperuser
heroku open

25.執行結果

2019年12月29日 星期日

sqlite(二) 使用python程式

#前言
  • json資料來自網路,所以執行此程式必須連上網路。

#說明
  • 程式說明就夾在程式碼中
  • sqlite3套件,是使用SQL資料庫查詢語言處理。
    • 這裡只做建立資料庫,插入資料和顯示資料的功能。
  • 執行程式中加一點輸入
    • 輸入資料庫名稱,例如,abc.db
    • 輸入資料表名稱,例如,mytable
  • 加一點輸出
    • 使用prettytable套件,讓輸出排列一下
#程式功能說明
  • 1216create-once.py建立資料庫資料表,插入資料。(執行一次就好,否則相同的資料就一直添進去。)
  • 1216showdata-in-table.py 使用prettytable套件輸出的資料。(有的地方排列扭曲了,查不出原因,不像是空格問題。)
#需要DB Browser for SQLite 來幫忙
  • python程式處理資料很快,但是並沒有一個方便的資料庫管理介面,這裡 列有一些工具。

#程式碼
  1. #參考來源: fatdodo所發表的文章,https://cheng-min-i-taiwan.blogspot.com/2019/12/pythonsqlite-open-data.html
  2. import os
  3. import requests 
  4. import json
  5. import sqlite3 ###在python3它是內建,不必在安裝。

  6. '''
  7. 這個程式取自網路資料,所以欄位是固定的,如35-38行。
  8. 1. db=sqlite3.connect("dbName") 建立資料庫
  9. 2. cursor=db.cursor() 指定cursor來定位資料
  10. 3. ###用cursor.execute()執行sql指令 CREATE, 建立table。注意,最好加 IF NOT EXISTS,才不會因為table已存在而出錯。
  11. 4. 用cursor.executemany(sql, data) 執行sql指令,一次多筆資料放進資料表
  12. 5. db.commit() 寫入資料庫
  13. '''


  14. os.system("cls")

  15. #建立資料庫
  16. print("=====建立資料庫=====\n\n")
  17. dbName = input("輸入資料庫名稱,例如abc.db-->    ")
  18. db = sqlite3.connect(dbName)
  19. cursor  = db.cursor() 
  20. print("{}資料庫已經成功建立\n".format(dbName)) 

  21. tableName=input("輸入資料表名稱-->  ")

  22. #準備資料
  23. url  = 'http://www.ilepb.gov.tw/api/ILEPB01001/format/JSON'
  24. print("讀取來自「{}」的資料".format(url))
  25. resp = requests.get(url)
  26. json_dict = json.loads(resp.text)
  27. data = list()
  28. for i in range(len(json_dict)):
  29.     t = (json_dict[i]['加油站名稱'], 
  30.          json_dict[i]['加油站地址'], 
  31.          json_dict[i]['負責人'], 
  32.          json_dict[i]['聯絡電話'])
  33.     data.append(t)

  34. #建資料表,使用sql查詢語言。
  35. sql = '''CREATE TABLE IF NOT EXISTS {:s}(
  36.          ID INTEGER PRIMARY KEY AUTOINCREMENT,
  37.          GAS TEXT NOT NULL, 
  38.          ADDR TEXT NOT NULL, 
  39.          OWNER  TEXT NOT NULL,
  40.          TEL TEXT);'''.format(tableName)
  41. try:
  42.     cursor.execute(sql)
  43. except Exception as e:
  44.     print(e)
  45. #將資料寫入資料表
  46. #多筆資料一次放入,data是先前的tuple
  47. sql = 'INSERT INTO {:s} (GAS, ADDR, OWNER, TEL) VALUES (?,?,?,?);'.format(tableName)
  48. try:
  49.     cursor.executemany(sql, data) #寫入多筆資料的命令
  50.     db.commit() #這個指令才是真正寫入資料庫
  51. except Exception as e:
  52.     print(e)  
  53. print(".......")
  54. print("{}資料表已經完成輸入資料".format(dbName))
  55. cursor.close()

  1. #參考來源: fatdodo所發表的文章,https://cheng-min-i-taiwan.blogspot.com/2019/12/pythonsqlite-open-data.html
  2. import os
  3. import sqlite3 ###在python3它是內建,不必在安裝。

  4. '''
  5. 1. db=sqlite3.connect("dbName") 建立資料庫
  6. 2. cursor=db.cursor() 指定cursor來定位資料
  7. 3. ###用cursor.execute()執行sql指令 CREATE, 建立table。注意,最好加 IF NOT EXISTS,才不會因為table以存在而出錯。
  8. 4. 用cursor.executemany(sql, data) 執行sql指令,一次多筆資料放進資料表
  9. 5. db.commit() 寫入資料庫
  10. '''

  11. def show_table(cursor,tbName):
  12.     sql = 'SELECT * FROM {:s} ORDER BY id ASC;'.format(tbName)
  13.     try:
  14.         cursor.execute(sql)
  15.         rows= cursor.fetchall()
  16.         for i, row in enumerate(rows,1): #1代表i從1開始,內定是從0開始。
  17.             print(i, '>', row)
  18.     except Exception as e:
  19.         print(e)

  20. os.system("cls")
  21.         
  22. #開啟資料庫
  23. print("=====觀看資料表內容=====\n\n")
  24. dbName = input("輸入資料庫名稱,例如abc.db-->  ")
  25. db = sqlite3.connect(dbName)
  26. cursor  = db.cursor() 
  27. print("{}資料庫已經成功開啟\n".format(dbName)) 

  28. tableName = input("輸入要觀看的資料表-->  ")

  29.     
  30. show_table(cursor,tableName)
  31. cursor.close()

  1. #參考來源: fatdodo所發表的文章,https://cheng-min-i-taiwan.blogspot.com/2019/12/pythonsqlite-open-data.html
  2. import os
  3. import sqlite3 ###在python3它是內建,不必在安裝。
  4. from prettytable import PrettyTable

  5. '''
  6. 1. db=sqlite3.connect("dbName") 建立資料庫
  7. 2. cursor=db.cursor() 指定cursor來定位資料
  8. 3. ###用cursor.execute()執行sql指令 CREATE, 建立table。注意,最好加 IF NOT EXISTS,才不會因為table以存在而出錯。
  9. 4. 用cursor.executemany(sql, data) 執行sql指令,一次多筆資料放進資料表
  10. 5. db.commit() 寫入資料庫
  11. '''

  12. def show_table(cursor,tbName):
  13. #建立表格項目名稱
  14.     table = PrettyTable(['編號','加油站名稱','加油站地址','負責人','聯絡電話'])
  15.     table.align = "l" 
  16.     table.border=False
  17.     table.padding_width=3
  18.     
  19.     sql = 'SELECT * FROM {:s} ORDER BY id ASC;'.format(tbName)
  20.     try:
  21.         cursor.execute(sql)
  22.         rows= cursor.fetchall()
  23.         for row in rows: 
  24.             table.add_row(row)
  25.         #印出table
  26.         print(table)
  27.     except Exception as e:
  28.         print(e)

  29. os.system("cls")
  30.         
  31. #開啟資料庫
  32. print("=====觀看資料表內容=====\n\n")
  33. dbName = input("輸入資料庫名稱,例如abc.db-->  ")
  34. db = sqlite3.connect(dbName)
  35. cursor  = db.cursor() 
  36. print("{}資料庫已經成功開啟\n".format(dbName)) 

  37. tableName = input("輸入要觀看的資料表-->  ")





  38.     
  39. show_table(cursor,tableName)
  40. cursor.close()


#將mobirise產生的網頁,融入django。

摘要:
1. 在mobirise中拉一拉模組,再調一下模組內的小零件,漂亮的網頁架構就好了。
2. 用notepad++的巨集功能,一鍵搞定調整的工作,融入django環境
3. django本身的必要設定,urls.py,views.py

上面3個步驟,django就有一個自建的主題網頁出來了。

至於要什麼功能,就看使用者自己加囉!

***開始工作***
#1 mobirise的操作
成果是會產生一些html檔案和一個assets資料夾,
拷貝到django相關目錄,如下。(這裡的專案叫forgo)

其中html檔,檔名是mobirise因增刪而自動調整出來的,
需要的話也可以自行修改,但也要把檔案內的連結一起修改。(需要的話,參考下面notepad++<2>的方法)
這裡是上面檔案的  zip檔,你也玩玩看,超連結請按GO喔。


#2 notepad++部份的操作

<1>在notepad++中把
index.html
page5.html
page6.html
page7.html
page8.html

打開編輯,如下圖(其它檔案請先關閉,因為要做多檔案的取代)

<2>取代方法一律使用「在所有開啟文件中取代

取代的內容如下,
第一部份html超連結的取代
index.html--> /
page5.html--> /5/
page6.html--> /6/
page7.html--> /7/
page8.html--> /8/


第二部份css,js,jpg,png等靜態檔案的取代
<!DOCTYPE html>  -->  <!DOCTYPE html>{% load static %}
"assets  -->  "{% static "assets
.jpg"  -->  .jpg" %}
.png"  -->  .png" %}
.js"  -->  .js" %}
.css"  -->  .css" %}
(已經完成調整html檔案的  zip檔案,你也玩玩看。)

操作範例圖示



notepad++操作小結
將以上<2>的步驟錄製成巨集,日後如果在mobirise中有修改,只要執行巨集,就能立即融入django中使用。
如下圖顯示,已經錄製儲存成mobirise2djago巨集,
日後如果要再執行以上的取代步驟,只要點選 mobirise2django的巨集即可。

#3 django部份的操作

--建立好自己的project和app

--在urls.py中加入

#myapp是你自己的app名稱
from myapp.views import page5,page6,page7,page8,index

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',index),
    path('5/',page5),
    path('6/',page6),
    path('7/',page7),
    path('8/',page8),
]

**以上都是放在網址下第一層,你也可以自行調整,例如path('5/6/',page6)
**views中的名字都取和html一樣的檔名,方便管理。

--在views.py中加入

def index(request):
    pass
    return render(request,"index.html")
def page5(request):
    pass
    return render(request,"page5.html")
def page6(request):
    pass
    return render(request,"page6.html")
def page7(request):
    pass
    return render(request,"page7.html")
def page8(request):
    pass
    return render(request,"page8.html")
以上只是測試連結,沒有任何動作,要有什麼功能,就要自己加囉!

#完成
  • 啟動 python manage.py runserver 8000  ,應該就可以看到成果了。

p.s.如果要送上網站,靜態檔案assets目錄的部份,各個服務商的伺服器可能有不同的處理方式。

#以上成果,加上sqlite資料庫的簡單操作實驗網頁

(sqlite參考fatdodo的介紹)

2019年12月28日 星期六

DB Browser for SQLite

#簡介
DB Browser for SQLite是開源軟體,可以
  • 建立新資料庫
  • 觀看sqlite資料庫內容
  • 設計資料表
  • 編輯資料庫資料
  • 各式匯入匯出


#簡單說明如下,操作很簡單。
(直接在圖內說明)
#編輯資料表結構

sqlite(一) 看sqlite多厲害

#官網資料
  • 使用有多廣泛,下面的系統或裝置中都有sqlite,包山包海啊!
  • Every Android device
  • Every iPhone and iOS device
  • Every Mac
  • Every Windows10 machine
  • Every Firefox, Chrome, and Safari web browser
  • Every instance of Skype
  • Every instance of iTunes
  • Every Dropbox client
  • Every TurboTax and QuickBooks
  • PHP and Python
  • Most television sets and set-top cable boxes
  • Most automotive multimedia systems
  • Countless millions of other applications
  • 特性
  • 任何用途,完全免費。
  • 程式碼公開
  • 開發團隊承諾至少維護到2050年(開始於2000-05-09)
  • 三位全時開發人員

使用mobirise快速建立漂亮外觀的網站

#簡介
  • 官網(包含操作的影片介紹),製作軟體也在官網下載。

  • mobirise是一個rwd(response web desin)的網頁製作軟體,能在電腦和手機上自動調整的顯示。

  • 使用心得:
    • 免費,沒有廣告,每個地方都可以編輯、更換,非常的好。個人使用,相當足夠。

    • 要發揮一下想像力,組合不同的區塊,調動每一個區塊的參數,能夠變化出不同的風格。

    • 如果需求更多,花一點錢,買個新鮮的主題,省下的時間,值得了。

#速編訣竅

1. 整個網站,可以複製,再修改,調整,就成了新的網站。

2. 每一個頁面,可以複製,再修改,調整就成了新的頁面。

3. 每一個調好參數的區塊,可以存成user block,往後就能重複使用。

#操作介紹
  • 整體畫面簡介。
1. 左邊:網站、網頁和帳戶的建立,包含名稱以及相關的參數設定和操作。

2. 中央:編輯區和顯示模式,點選可切換電腦或手機顯示。圖片處是編輯區。(首次進入應該是空白頁面)

3. 右上:發布,將結果存到磁碟中,也可以直接發布到網路。

 左下方有一個紅色的加號,點選後,可以開始增添區塊(block)了。(區塊就是各種網頁的內容)
關於帳戶:第一次進入製作程式,可能被要求登入。
輸入email為例
收email,裡面包含了密碼,將密碼填入2中。
關於網站:新增一個網站,或編輯現有網站。
關於頁面:首頁(HOME)是自動產生,可以新增頁面,設定頁面參數。
  • 區塊操作:從這裡開始,編輯網頁內容。
1. 切換電腦或手機顯示模式。
2. 是區塊的分類,可以快速找到區塊類別。
3. 是區塊,每一個分類,可能有多個區塊可以選擇,把區塊拉進左邊的編輯區。
進入編輯區,個別編輯每一個區塊
區塊的整體操作:移動,儲存,設定參數,刪除。
調整一個區塊的參數:不同的區塊,會顯示不同的參數。以下有3個例子。

編輯區塊內容:
任何文字,除了編修之外,只要選取一段文字,就可以插入超連結。(有極少部份例外)
任何圖片,只要點選,就可以進入更多設定。(p.s. slider的圖片是在參數中設定。)
任何圖示,只要點選,就能進入更多設定。
#編輯告一段落,就可以發布,存到硬碟,或送到網路上。

#後記

  • salamander雙視窗檔案軟體,整合了ftp操作。

以上二者,讓你做出來的網頁,立刻發布到網路上。

2019年12月22日 星期日

1081222wifiboy程式遊戲開發板


1081220 wifiboy開箱介紹

一位國中生賴睿麒的發想 製作 

幼稚園開始摸scratch,國中做出wifiboy

在台北的一次 make fair展出作品中被注意


Wiboy靈感來自小時候的gameboy

硬體架構
按鍵/ 開發板 / 螢幕 喇叭
輸入/處理/輸出

程式語言
微軟arcade積木/python/c

以做遊戲架構寫程式
角色/鏡頭/事件

教學模式
仿作/改作/創作/合作

玩遊戲也可以玩出wifiboy

似乎是美國才有的環境

很高興聽到原創作者高二生自信的分享

做遊戲比玩遊戲更Cool

這幾年跟遊戲概念相關的都特別成功

手遊 pagamo 密室逃脫 kahoot quizlet.....

原作者taipei Ted演講影片網址

https://youtu.be/h8fx1iD6e54
 



2019年12月20日 星期五

從0開始的紙板機器人

#前言
使用紙板做機器人,主要的好處是,又便宜,又好操作,不用使用特殊的機具,例如鋸子,雷射雕刻機,就能夠組裝,比較像在做勞作。

缺點就是,結構弱,支撐力不好。

有了這次經驗,如果能改用瓦楞板,或是pp板,結構、支撐力應該會好很多。

#準備
紙板:300磅厚紙板
webduino smart板
伺服馬達3顆
軟體
行動電源
(原本9V電池的構想沒成功)

#先來累積小成果
第一次,先用普通A4影印紙練習組裝,(小機器人)了解架構。
第二次,重組模板,放大到A3,買厚紙版來組裝(大機器人),探討未來安裝的空間和堅固度。

 
第三次,買現成的套件組裝,練習伺服馬達操作。
第四步,完成自己的組裝
 

#軟體的準備
  • 測試用平板控制二軸小雲台

#裝置的一些過程
  • 固定伺服馬達(土法煉鋼啊)
 1. 找到一個大瓶鮮奶的蓋子,測量能讓伺服馬達稍微突出軸心的高度,大約是0.7mm左右。畫個圈。
 
 2. 切割。
用美工刀其實還蠻危險的,因為不好抓,太用力又會瞬間切很多,這恐怕不是好主意,目前只有先這樣了。
 
 3. 開口讓伺服馬達裝進去,並鎖上螺絲。
大小約是23mmX12mm
 
 4. 在凹凸不平的蓋面開洞,不是很好操作,就將就著用。
 
 5. 裝上伺服馬達,這最簡單的了。
 
 6. 採用白膠固定,所以要等到隔天,讓它乾。
(總共有三個固定架,這是另外一個的圖片,顏色不一樣囉!)
 

#線路
 1. 這是正面。
線路想了好久,計畫趕不上變化。沒考慮到的地方還是不少。
主要是電力,和動作後的電線扭動。
 
 2. 本來想全部塞進頭部和肚子,但是線還真是多,而且沒有好好的走線規劃,只好將一塊小麵包板,掛在背後。
(後來也沒有大用,只當共用電源和接地)
 
 3. 肚子上方是伺服馬達,線從背後穿出,(本來是想從上方穿出,但沒有考慮到頭轉動時,線也會跟著被扭動)下面是9V電池,測試時,它是可以將smart板驅動,但是,實際運用時,一下子就讓smart板當掉重開機,只好放棄。
 
 4.  頭部裝的是smart板,左右是手臂的伺服馬達。
電源線已經盡量捲起來了,下面白色方塊是usb母頭,原本要接收9V轉來的電,後來還是失敗,也就沒用了。(這個還是要克服,因為行動電源都很重,紙的結構撐不起。)
 
 5. 這塊小麵包板的功用是共地,共電源,因為smart板只有各一個接點。
中央是7805穩壓電路,左下方來的電線是9V的供電,因電力不穩,也沒用上了。
 
 6. 背面整體接線圖 
#再來看一次成果