
{"id":7524,"date":"2018-06-27T17:58:39","date_gmt":"2018-06-27T08:58:39","guid":{"rendered":"https:\/\/okiraku-camera.tokyo\/blog\/?page_id=7524"},"modified":"2018-06-30T20:48:30","modified_gmt":"2018-06-30T11:48:30","slug":"arduino-nano%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e8%b5%a4%e5%a4%96%e7%b7%9a%e3%83%aa%e3%83%a2%e3%82%b3%e3%83%b3%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e5%8f%97%e4%bf%a1%e5%99%a8%e3%81%ae%e6%94%b9","status":"publish","type":"page","link":"https:\/\/okiraku-camera.tokyo\/blog\/?page_id=7524","title":{"rendered":"Arduino nano\u3092\u4f7f\u3063\u305f\u8d64\u5916\u7dda\u30ea\u30e2\u30b3\u30f3\u30c7\u30fc\u30bf\u306e\u53d7\u4fe1\u5668\u306e\u6539\u8a02\u7248\u30b9\u30b1\u30c3\u30c1"},"content":{"rendered":"<h1>\u6982\u8981<\/h1>\n<p>\u4ee5\u524d\u3001ATmega328p\u3068USB\u30dd\u30fc\u30c8\u3092\u5099\u3048\u305fArduino nano\u3092\u4f7f\u3063\u3066\u3001\u5bb6\u96fb\u7528\u8d64\u5916\u7dda\u30ea\u30e2\u30b3\u30f3\u306e\u9001\u4fe1\u30c7\u30fc\u30bf\u3092\u89e3\u6790\u3059\u308b\u4ed5\u7d44\u307f\u3092\u4f5c\u3063\u305f\u306e\u3060\u3051\u3069\u3001AV\u6a5f\u5668\u7528\u306e\u30ea\u30e2\u30b3\u30f3\u30c7\u30fc\u30bf\u3092\u53d6\u308a\u59cb\u3081\u3066\u307f\u305f\u3089\u3001NEC\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u30ea\u30d4\u30fc\u30c8\u6a5f\u80fd\u306b\u307e\u3063\u305f\u304f\u5bfe\u5fdc\u3067\u304d\u3066\u3044\u306a\u3044\u3053\u3068\u304c\u5206\u304b\u3063\u305f\u3002<\/p>\n<p>\u4fe1\u53f7\u306e\u30bf\u30a4\u30df\u30f3\u30b0\u306b\u3064\u3044\u3066\u306f\u3001<a href=\"https:\/\/okiraku-camera.tokyo\/blog\/?p=4854\" target=\"_blank\" rel=\"noopener\">WROOM-02\u3092\u4f7f\u3063\u305f\u8d64\u5916\u7dda\u30ea\u30e2\u30b3\u30f3\u306e\u8abf\u67fb<\/a> \u3068\u3044\u3046\u6295\u7a3f\u5185\u306b\u30ea\u30d4\u30fc\u30c8\u6642\u306e\u52d5\u4f5c\u56f3\u3092\u8ffd\u52a0\u3002\u5bfe\u5fdc\u3059\u308b\u56de\u8def\u56f3\u306f\u3001<a href=\"https:\/\/okiraku-camera.tokyo\/blog\/?p=5217\">\u5143\u306e\u30da\u30fc\u30b8<\/a>\u306e\u300c\u8ffd\u8a18(\u30df\u30cb\u30d6\u30ec\u30c3\u30c9\u30dc\u30fc\u30c9\u7248)\u300d\u3092\u53c2\u7167\u3002<\/p>\n<p>\u6539\u8a02\u3057\u305f\u30b9\u30b1\u30c3\u30c1\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3002<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;math.h&gt;\r\n#define START_MSG \"\\n\" + String(__FILE__) + \" start.\"\r\n\r\n\/\/ for Arduino (ATMega328P 16MHz)\r\n#define IR_PIN 2\r\n#define READ_IR_PIN()  (uint8_t)(PIND &amp; B00000100)\r\nvoid decode_data(int count);\r\n\r\nvoid setup()\r\n{\r\n  delay(100);\r\n  Serial.begin(115200);\r\n  pinMode(IR_PIN, INPUT);\r\n  Serial.println(START_MSG);\r\n  TCCR1A = 0;\r\n  TCCR1B = 3; \/\/ x1\/64 prescaler. (250kHz)\r\n}\r\n\/\/  IR\u30ea\u30e2\u30b3\u30f3\u53d7\u4fe1\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u51fa\u529b\u3092\u3068\u3089\u3048\u3066\u3001H\u671f\u9593\u3001L\u671f\u9593\u3092usec\u5358\u4f4d\u306b\u8a18\u61b6\u3059\u308b\u3002\r\n\/\/  \u7acb\u4e0b\u308a\uff5e\u7acb\u4e0a\u308a\u306e\u6642\u9593\u304cH\u671f\u9593\u3001\u7acb\u4e0a\u308a\uff5e\u7acb\u4e0b\u308a\u306e\u6642\u9593\u304cL\u671f\u9593\u3068\u306a\u308b\u3002\r\n\/\/ TC1\u3092x1\/64\u30d7\u30ea\u30b9\u30b1\u30fc\u30e9\u3067\u52d5\u304b\u3057(250kHz)\u30014usec\u306e\u7c92\u5ea6\u306e\u30ab\u30a6\u30f3\u30bf\u5024\u3092\u8a18\u61b6\u3059\u308b\u3002\r\n\r\ntypedef struct {\r\n  unsigned short  high;  \/\/ H\u671f\u9593\u306eusec\u3000(4usec\u5358\u4f4d)\r\n  unsigned short  low;   \/\/ L\u671f\u9593\u306eusec\u3000(4usec\u5358\u4f4d)\r\n} irdata_t;\r\n\r\n#define AEHA_T  425\r\n#define NEC_T 560\r\n#define UNKNOWN_T 500\r\n\r\n#define DATA_COUNT  330\r\nirdata_t irdata[DATA_COUNT] = {0};\r\nunsigned short t_length;\r\n\r\nconst inline unsigned long get_low(int index) { return (unsigned long) irdata[index].low &lt;&lt; 2; }\r\nconst inline unsigned long get_high(int index) { return (unsigned long) irdata[index].high &lt;&lt; 2; }\r\n\r\n\r\n#define TIME_LIMIT  1000000L  \/\/ \u6700\u9577\u30671\u79d2\u9593\u3068\u308b\u3002\r\nvoid loop()\r\n{\r\n  int data_count;\r\n  while(READ_IR_PIN())\r\n    ;\r\n  uint8_t last_state = 0;\r\n  data_count = 0;\r\n  unsigned long start_time = micros();\r\n  TCNT1 = 0;\r\n  while(data_count &lt; DATA_COUNT) { \r\n    if (micros() - start_time &gt; TIME_LIMIT)\r\n      break; \r\n    uint8_t state = READ_IR_PIN();\r\n    if (state != last_state) {\r\n      last_state = state;\r\n      if (!state)\r\n        irdata[data_count++].low = TCNT1;\r\n      else\r\n        irdata[data_count].high = TCNT1;\r\n      TCNT1 = 0;\r\n    }\r\n  }\r\n \/\/ \u691c\u51fa\u7d42\u4e86\r\n  if (data_count &gt; 23) {\r\n    \/\/ H\u671f\u9593\u306e\u9577\u3055\u306b\u3088\u308a\u3001T\u5024\u3092\u6c7a\u3081\u308b\u3002\r\n    \/\/ \u6700\u521d\u306e20\u500b\u306eH\u671f\u9593\u306e\u9577\u3055\u304c\u3001\u6a19\u6e96T\u5024\u306e\u8fd1\u508d\u306b\u53ce\u307e\u3063\u3066\u3044\u308b\u6570\u304c10\u500b\u4ee5\u4e0a\u304b\u3069\u3046\u304b\u3002\r\n    int nec = 0;\r\n    int aeha = 0;\r\n    for(int i = 0; i &lt; data_count - 1; i++) {\r\n      if (i &lt; 20) {\r\n        unsigned long high = get_high(i);\r\n        if (high &gt; 800)\r\n            continue;\r\n        if (high &gt; AEHA_T - 45 &amp;&amp; high &lt; AEHA_T + 65)\r\n          aeha++;\r\n        if (high &gt; NEC_T - 60 &amp;&amp; high &lt; NEC_T + 80)\r\n          nec++; \r\n      }\r\n    }\r\n    t_length = UNKNOWN_T; \/\/ \u3069\u3061\u3089\u3067\u3082\u306a\u3044\u3002\u9069\u5f53\u306a\u5024\r\n    if (aeha &gt; 10 &amp;&amp; aeha &gt; nec)\r\n      t_length = AEHA_T;\r\n    else if (nec &gt; 10 &amp;&amp; nec &gt; aeha)\r\n      t_length = NEC_T;\r\n    Serial.println(\"use T = \" + String(t_length) + \" usec.\");\r\n    decode_data(data_count);    \r\n  }\r\n}\r\n\r\n\/\/ index\u306f\u30c7\u30fc\u30bf\u6570\u306e\u7bc4\u56f2\u5185\u3067\u3042\u308b\u3053\u3068\u3002\r\nvoid calc_t(int index, int&amp; high, int&amp; low) {\r\n  high = (int) round((float)(get_high(index)) \/ t_length);\r\n  low = (int) round((float)(get_low(index)) \/ t_length);\r\n}\r\n\r\nbool isLeader(int high, int low) {\r\n  if ((t_length == AEHA_T &amp;&amp; high == 8 &amp;&amp; low == 4) ||\r\n      (t_length == NEC_T &amp;&amp; high == 16 &amp;&amp; low == 8))  \/\/ \u30ea\u30fc\u30c0\u30fc\u691c\u51fa\r\n    return true;\r\n  return false;        \r\n}\r\n\r\nbool isTrailer(int index) {\r\n  return (get_low(index) &gt; 8000) ? true : false;\r\n}\r\n\r\nbool isRepeat(int high, int low) {\r\n  if (t_length == NEC_T &amp;&amp; high == 16 &amp;&amp; low == 4)\r\n    return true;\r\n  return false;    \r\n}\r\n\r\nuint8_t get_bit(int high, int low) {\r\n  byte value = 0;\r\n  if (high == 1 &amp;&amp; (low == 3 || low == 4))\r\n    value = 1;\r\n  return value;      \r\n}\r\n\r\nvoid show_data(int start, int count) {\r\n  Serial.print(F(\"\\nTransfer DATA = \"));\r\n  while(count &gt;= 8) {\r\n    uint8_t cur = 0;\r\n    for(int i = 0; i &lt; 8; i++) {\r\n      int high_T, low_T;\r\n      calc_t(start++, high_T, low_T);\r\n      uint8_t value = get_bit(high_T, low_T);\r\n      cur = cur &gt;&gt; 1 | (value ? 0x80 : 0);       \r\n    }\r\n    count -= 8;\r\n    char tmp[4];\r\n    sprintf(tmp, \"%02x \", cur);\r\n    Serial.print(tmp);\r\n  }\r\n  Serial.println();\r\n}\r\n\r\nvoid decode_data(int total) {\r\n  enum { s_none = 0, s_post_leader, s_data, s_trailer, s_repeat} state = s_none;\r\n  int index = 0;\r\n  int high_T, low_T;\r\n  int data_start = 0;\r\n  char tmp[60];\r\n\r\n  while (index &lt; total) {\r\n      delay(1);\r\n      calc_t(index, high_T, low_T);\r\n      uint8_t val = get_bit(high_T, low_T);\r\n    switch(state) {\r\n    case s_none:\r\n      if (isLeader(high_T, low_T)) {\r\n        Serial.println(F(\"\\n--- LEADER ---\"));\r\n        state = s_post_leader;\r\n      } else if (isRepeat(high_T, low_T))\r\n        Serial.println(F(\"\\n--- REPEAT ---\"));\r\n      break;\r\n    case s_post_leader:      \r\n      Serial.println(F(\"\\n--- DATA ---\"));\r\n      data_start = index;\r\n      state = s_data;\r\n      break;      \r\n    case s_data:\r\n      if (isTrailer(index)) {\r\n        show_data(data_start, index - data_start);\r\n        Serial.println(F(\"\\n--- TRAILER or STOP ---\"));\r\n        state = s_none;\r\n        data_start = 0;\r\n      }\r\n      break;\r\n    }\r\n    sprintf(tmp, \"%d : high = %lu, low = %lu, T:%u, %u, bit=%d\", index + 1, get_high(index), get_low(index), high_T, low_T, val);\r\n    Serial.println(tmp);\r\n    index++;\r\n  }\r\n  if (data_start &gt; 0)\r\n    show_data(data_start, index - data_start);\r\n  Serial.println(F(\"\\n---- END ----\\n\"));  \r\n}<\/pre>\n<p>\u304a\u3082\u306a\u5909\u66f4\u70b9\u306f\u4ee5\u4e0b\u306e\u3068\u304a\u308a\u3002<\/p>\n<ul>\n<li>\u30ea\u30d4\u30fc\u30c8\u51fa\u529b\u9593\u9694\u306f90msec\u4ee5\u4e0a\u3042\u308b\u306e\u3067\u3001\u03bcsec\u5358\u4f4d\u3067\u306f16\u30d3\u30c3\u30c8\u9577\u306e\u30c7\u30fc\u30bf\u306b\u683c\u7d0d\u3067\u304d\u306a\u3044\u3002\u305d\u306e\u305f\u3081\u30014\u03bcsec\u5358\u4f4d\u306b\u30bf\u30a4\u30df\u30f3\u30b0\u3092\u5f97\u308b\u3053\u3068\u306b\u3057\u305f\u3002<\/li>\n<li>\u30bf\u30a4\u30de\u30ab\u30a6\u30f3\u30bf\u30fc1(TC1)\u30e6\u30cb\u30c3\u30c8\u306e\u30ab\u30a6\u30f3\u30bf\u3092\u4f7f\u3063\u3066\u8d64\u5916\u7dda\u53d7\u4fe1\u6a5f\u306e\u51fa\u529b\u30ec\u30d9\u30eb\u304c\u5909\u308f\u3063\u305f\u30bf\u30a4\u30df\u30f3\u30b0\u3092\u8a18\u61b6\u3059\u308b\u3002\u30b7\u30b9\u30c6\u30e0\u30af\u30ed\u30c3\u30af16MHz\u306a\u306e\u3067\u3001TC1\u306e\u30d7\u30ea\u30b9\u30b1\u30fc\u30e9\u306b\u3088\u3063\u30661\/64\u3068\u3057\u3066250kHz\u3067\u30ab\u30a6\u30f3\u30c8\u30a2\u30c3\u30d7\u3055\u305b\u3001TCNT1\u306e\u5024\u3092\u8aad\u307f\u53d6\u308b\u3053\u3068\u306b\u3057\u305f\u3002\u540c\u6642\u306bTC1\u3092\u5225\u306e\u7528\u9014(\u30bf\u30a4\u30de\u30fc\u5272\u8fbc\u307f\u3068\u304b)\u306b\u4f7f\u3046\u3053\u3068\u306f\u3067\u304d\u306a\u3044\u3053\u3068\u306b\u6ce8\u610f\u3002<\/li>\n<li>\u53d6\u308a\u8fbc\u307f\u7cbe\u5ea6\u3092\u4e0a\u3052\u308b\u305f\u3081\u3001\u4f59\u8a08\u306a\u3053\u3068\u3092\u6e1b\u3089\u3057\u305f\u3002<\/li>\n<\/ul>\n<p>\u3068\u3044\u3063\u305f\u3068\u3053\u308d\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6982\u8981 \u4ee5\u524d\u3001ATmega328p\u3068USB\u30dd\u30fc\u30c8\u3092\u5099\u3048\u305fArduino nano\u3092\u4f7f\u3063\u3066\u3001\u5bb6\u96fb\u7528\u8d64\u5916\u7dda\u30ea\u30e2\u30b3\u30f3\u306e\u9001\u4fe1\u30c7\u30fc\u30bf\u3092\u89e3\u6790\u3059\u308b\u4ed5\u7d44\u307f\u3092\u4f5c\u3063\u305f\u306e\u3060\u3051\u3069\u3001AV\u6a5f\u5668\u7528\u306e\u30ea\u30e2\u30b3\u30f3\u30c7\u30fc\u30bf\u3092\u53d6\u308a\u59cb\u3081\u3066\u307f\u305f\u3089\u3001NEC\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e &hellip; <a href=\"https:\/\/okiraku-camera.tokyo\/blog\/?page_id=7524\" class=\"more-link\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"screen-reader-text\">Arduino nano\u3092\u4f7f\u3063\u305f\u8d64\u5916\u7dda\u30ea\u30e2\u30b3\u30f3\u30c7\u30fc\u30bf\u306e\u53d7\u4fe1\u5668\u306e\u6539\u8a02\u7248\u30b9\u30b1\u30c3\u30c1<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-7524","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/pages\/7524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7524"}],"version-history":[{"count":0,"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=\/wp\/v2\/pages\/7524\/revisions"}],"wp:attachment":[{"href":"https:\/\/okiraku-camera.tokyo\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}