{"id":18,"date":"2018-12-04T10:30:24","date_gmt":"2018-12-04T01:30:24","guid":{"rendered":"http:\/\/ps2.ddns.net\/press\/?p=18"},"modified":"2021-04-09T10:25:34","modified_gmt":"2021-04-09T01:25:34","slug":"ef-lense1","status":"publish","type":"post","link":"https:\/\/rfsec.ddns.net\/db\/?p=18","title":{"rendered":"Arduino\u3067EF\u30ec\u30f3\u30ba\u3092\u5236\u5fa1\u3059\u308b\u5b9f\u9a13"},"content":{"rendered":"\n<p>Arduino\u3067EF\u30ec\u30f3\u30ba\u3092\u5236\u5fa1\u3059\u308b\u5b9f\u9a13\u306e\u30e1\u30e2\u3067\u3059\u3002\u30ab\u30e1\u30e9\u30ec\u30f3\u30ba\u3067\u661f\u96f2\u306a\u3069\u3092\u64ae\u5f71\u3057\u3088\u3046\u3068\u3059\u308b\u3068\u3001\u624b\u52d5\u3067\u30d4\u30f3\u30c8\u3092\u5408\u308f\u305b\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u5fae\u5999\u306a\u64cd\u4f5c\u304c\u5fc5\u8981\u3067\u306a\u304b\u306a\u304b\u30d4\u30f3\u30c8\u3092\u5408\u308f\u305b\u308b\u306e\u306b\u82e6\u52b4\u3057\u307e\u3059\u3002\u305d\u3053\u3067\u3001\u30b9\u30c6\u30c3\u30d4\u30f3\u30b0\u30e2\u30fc\u30bf\u3067\u30d4\u30f3\u30c8\u3092\u8abf\u6574\u3057\u3088\u3046\u3068\u30013D\u30d7\u30ea\u30f3\u30bf\u30fc\u3067\u3053\u3093\u306a\u3082\u306e\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u305f\u3002\u305d\u3046\u3053\u3046\u3057\u3066\u3044\u308b\u3046\u3061\u306b\u3001CANON\u306eEF\u30ec\u30f3\u30ba\u3092Arduino\u3067\u5236\u5fa1\u3067\u304d\u308b\u3089\u3057\u3044\u3068\u306e\u60c5\u5831\u3092\u5f97\u3066\u3001\u81ea\u5206\u3067\u3082\u5b9f\u9a13\u3057\u3066\u307f\u308b\u3053\u3068\u306b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/livedoor.blogimg.jp\/mars_999\/imgs\/e\/8\/e8e106b9.png\" alt=\"\" width=\"254\" height=\"477\"\/><\/figure>\n\n\n\n<p>\u30ec\u30f3\u30ba\u306e\u5236\u5fa1\u4fe1\u53f7\u3092\u53d6\u308a\u51fa\u305b\u308b<a rel=\"noreferrer noopener\" href=\"https:\/\/www.ebay.com\/itm\/Macro-Extension-Adapter-Tube-Ring-for-Canon-EOS-EF-Lens-Camera-4-2-21cm-Focusing\/263793347001?_trkparms=aid%3D111001%26algo%3DREC.SEED%26ao%3D1%26asc%3D20160908105057%26meid%3D20424cbc644843a693d8f200e88d5d9a%26pid%3D100675%26rk%3D1%26rkt%3D15%26sd%3D263793347001%26itm%3D263793347001&amp;_trksid=p2481888.c100675.m4236&amp;_trkparms=pageci%3A7bebd9c3-fae1-11e8-947d-74dbd18087f9%7Cparentrq%3A8db4d9201670aadc1a01e5bffff3ebd3%7Ciid%3A1\" target=\"_blank\">\u30de\u30a6\u30f3\u30c8\u30a2\u30c0\u30d7\u30bf\u30fc\u3092\u6ce8\u6587<\/a>\u3057\u305f\u306e\u3067\u3059\u304c\u3001\u5230\u7740\u306b\u306f\u3057\u3070\u3089\u304f\u6642\u9593\u304c\u304b\u304b\u308a\u305d\u3046\u306a\u306e\u3067\u3001\u624b\u6301\u3061\u306e\u30ab\u30e1\u30e9\u30ec\u30f3\u30ba\uff08EF-S 18-55mm USM)\u304b\u3089\u4fe1\u53f7\u3092\u53d6\u308a\u51fa\u3059\u305f\u3081\u306b\u3001\uff17\u672c\u306e\u30ea\u30fc\u30c9\u7dda\u3092\u534a\u7530\u3065\u3051\u3057\u307e\u3059\u3002\uff08\u3042\u304f\u307e\u3067\u3082\u81ea\u5df1\u8cac\u4efb\u3067\u3001\u3001\uff09<br>\u3053\u306e\u4f5c\u696d\u306b\u306f\u3001<a rel=\"noreferrer noopener\" href=\"http:\/\/web.media.mit.edu\/~bandy\/invariant\/move_lens.pdf\" target=\"_blank\">\u3053\u3061\u3089\u306e\u30ea\u30f3\u30af<\/a>\u304c\u975e\u5e38\u306b\u53c2\u8003\u306b\u306a\u308a\u307e\u3057\u305f\u3002\u5927\u578b\u306e\u30ec\u30f3\u30ba\u3067\u306f\u3001\u30ec\u30f3\u30ba\u3092\u99c6\u52d5\u3059\u308b\u30e2\u30fc\u30bf\u7528\u3068\u3057\u3066\uff16V\u306e\u5225\u96fb\u6e90\u304c\u5fc5\u8981\u306e\u3088\u3046\u3067\u3059\u304c\u3001\u5b9f\u9a13\u306b\u4f7f\u3063\u305f\u30ec\u30f3\u30ba\u3067\u306f\u30ed\u30b8\u30c3\u30af\u56de\u8def\u3068\u540c\u3058\uff15V\u3067\u554f\u984c\u306a\u304f\u99c6\u52d5\u3067\u304d\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/livedoor.blogimg.jp\/mars_999\/imgs\/7\/a\/7a1a1b93.png\" alt=\"\" width=\"340\" height=\"266\"\/><\/figure>\n\n\n\n<p><strong>\u4e3b\u306a\u6750\u6599<\/strong><br>\u79cb\u6708\u306e\uff12\u8272LED\u4ed8\u304d\u30ed\u30fc\u30bf\u30ea\u30fc\u30a8\u30f3\u30b3\u30fc\u30c0<br>OLED&nbsp; 128&#215;64 I2C \u30c7\u30a3\u30b9\u30d7\u30ec\u30a4<br>Arduino NANO<\/p>\n\n\n\n<p><strong>\u56de\u8def\u56f3<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/livedoor.blogimg.jp\/mars_999\/imgs\/4\/8\/48aa6555-s.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2021\/04\/6d8debdf.png\" alt=\"\" class=\"wp-image-21\" width=\"361\" height=\"342\" srcset=\"https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2021\/04\/6d8debdf.png 620w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2021\/04\/6d8debdf-300x285.png 300w\" sizes=\"auto, (max-width: 361px) 100vw, 361px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"EF-LENS CONTROL\" width=\"625\" height=\"352\" src=\"https:\/\/www.youtube.com\/embed\/0_waUmQuUZQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><strong>\u5b9f\u9a13\u306b\u4f7f\u3063\u305fArduno NANO\u306e\u30b9\u30b1\u30c3\u30c1<\/strong><br>\u4e0d\u7528\u306a\u5909\u6570\u306a\u3069\u304c\u6b8b\u3063\u3066\u3044\u307e\u3059\u304c\u3001\u3068\u308a\u3042\u3048\u305a\u516c\u958b\u3057\u307e\u3059\u3002\uff08\u5b9f\u7528\u5316\u306b\u306f\u3001\u307e\u3060\u307e\u3060\u8ab2\u984c\u304c\u6b8b\u3063\u3066\u3044\u307e\u3059\u3002\uff09\u5236\u5fa1\u306e\u5bfe\u8c61\u306f\u30d5\u30a9\u30fc\u30ab\u30b9\u3068\u7d5e\u308a\u306e\uff12\u7a2e\u985e\u3067\u3059\u3002\u30ed\u30fc\u30bf\u30ea\u30fc\u30a8\u30f3\u30b3\u30fc\u30c0\u306eSW\u306e\u9577\u62bc\u3057\u3067\u3001\u8d64\u3068\u7dd1\u306eLED\u304c\u30c8\u30b0\u30eb\u3067\u70b9\u706f\u3057\u307e\u3059\u3002\u8d64\u306e\u70b9\u706f\u4e2d\u306bSW\u3092\u62bc\u3057\u3066\u30d5\u30a9\u30fc\u30ab\u30b9\u3092\u5909\u66f4\u3057\u3001\u7dd1\u306eLED\u70b9\u706f\u4e2d\u306bSW\u3092\u62bc\u3059\u3068\u7d5e\u308a\u5024\u3092\u5909\u66f4\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n   \u30ed\u30fc\u30bf\u30ea\u30fc\u30a8\u30f3\u30b3\u30fc\u30c0\u306e\u53c2\u7167\u30b3\u30fc\u30c9\n   https:&#47;&#47;jumbleat.com\/2016\/12\/17\/encoder_1\/\n*\/\n\/*\n   EF\u30ec\u30f3\u30ba\u306e\u5236\u5fa1\u95a2\u9023\u53c2\u8003\u30ea\u30f3\u30af\n   ASCOM EF Lens Controller\n   http:\/\/www.indilib.org\/media\/kunena\/attachments\/3728\/ascom_efEN.pdf\n\n   EF\u30ec\u30f3\u30ba\u304b\u3089\u4fe1\u53f7\u7dda\u306e\u5f15\u304d\u51fa\u306e\u53c2\u7167\u8cc7\u6599\n   How to Move Canon EF Lenses Yosuke Bando\n   http:\/\/web.media.mit.edu\/~bandy\/invariant\/move_lens.pdf\n\n   Canon\u3000EF\u30ec\u30f3\u30ba\u306eArduino\u5236\u5fa1\n   http:\/\/otobs.org\/hiki\/?EOS_model\n   Technical aspects of the Canon EF lens mount\n   http:\/\/www.eflens.com\/lens_articles\/ef_lens_mount.html\n*\/\n#include &lt;SPI.h&gt;\n#include &lt;EEPROM.h&gt;\n#include &lt;math.h&gt;\n\n#include &lt;Adafruit_GFX.h&gt;\n#include &lt;Adafruit_SSD1306.h&gt;\n#include &lt;Wire.h&gt;\n#define SCREEN_WIDTH 128\n#define SCREEN_HEIGHT 64\n#define OLED_RESET -1\n\/\/Adafruit_SSD1306 display(1);\nAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, OLED_RESET);\n#define RUN\n\n#define LED_SW   7\n#define ENC_A  2\n#define ENC_B  3\n#define LED_Red 14\n#define LED_Green 15\n\nvolatile byte pos;\nvolatile int  enc_count;\nboolean    sw = false;\nint mode = 0;\nint mode_counter&#91;2];\nint focuserPosition, targetPos, apValue, offset, apAddr, x, y;\nString targetStr, apStr, gStr;\nboolean IsMoving, IsFirstConnect;\nchar inStr&#91;6];\n\nvoid InitLens()\n{\n  SPI.transfer(0x0A);\n  delay(30);\n  SPI.transfer(0x00);\n  delay(30);\n  SPI.transfer(0x0A);\n  delay(30);\n  SPI.transfer(0x00);\n  delay(30);\n}\n\nint ENC_COUNT(int incoming) {\n  static int enc_old = enc_count;\n  int val_change = enc_count - enc_old;\n\n  if (val_change != 0)\n  {\n    incoming += val_change;\n    enc_old   = enc_count;\n  }\n  return incoming;\n}\n\nvoid ENC_READ() {\n  byte cur = (!digitalRead(ENC_B) &lt;&lt; 1) + !digitalRead(ENC_A);\n  byte old = pos &amp; B00000011;\n  byte dir = (pos &amp; B00110000) &gt;&gt; 4;\n\n  if (cur == 3) cur = 2;\n  else if (cur == 2) cur = 3;\n\n  if (cur != old)\n  {\n    if (dir == 0)\n    {\n      if (cur == 1 || cur == 3) dir = cur;\n    } else {\n      if (cur == 0)\n      {\n        if (dir == 1 &amp;&amp; old == 3) enc_count++;\n        else if (dir == 3 &amp;&amp; old == 1) enc_count--;\n        dir = 0;\n      }\n    }\n    pos = (dir &lt;&lt; 4) + (old &lt;&lt; 2) + cur;\n  }\n}\n\nvoid setup() {\n  digitalWrite(13, LOW); \/\/ SPI Clock PIN\n  pinMode(ENC_A, INPUT_PULLUP);\n  pinMode(ENC_B, INPUT_PULLUP);\n  pinMode(LED_Red, OUTPUT);\n  pinMode(LED_Green, OUTPUT);\n  pinMode(LED_SW, INPUT_PULLUP);\n\/\/  pinMode(MIN, INPUT_PULLUP);\n\/\/  pinMode(MAX, INPUT_PULLUP);\n  attachInterrupt(0, ENC_READ, CHANGE);\n  attachInterrupt(1, ENC_READ, CHANGE);\n\n  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);\n  display.clearDisplay();\n\n  \/\/ \u30c6\u30ad\u30b9\u30c8\u30b5\u30a4\u30ba\u3092\u8a2d\u5b9a\n  display.setTextSize(3);\n  \/\/ \u30c6\u30ad\u30b9\u30c8\u8272\u3092\u8a2d\u5b9a\n  display.setTextColor(WHITE);\n  display.setCursor(0, 10);\n  display.println(\"EF-LensFocuser\");\n  display.display();\n  delay(1000);\n  mode = 0;\n  apAddr = 0;\n  focuserPosition = 5000;\n  SPI.begin();\n  SPI.setBitOrder(MSBFIRST);\n  SPI.setClockDivider(SPI_CLOCK_DIV128);\n  SPI.setDataMode(SPI_MODE3);\n  digitalWrite(12, HIGH);\n  InitLens();\n  digitalWrite(LED_Red, HIGH);\n  digitalWrite(LED_Green, LOW);\n\n  apValue=EEPROM.read(apAddr);\n  Serial.begin(9600);\n  Serial.println(apValue);\n  \/\/ nothing to do inside the setup\n}\n\nvoid loop() {\n  int sw_count;\n  short counter_now;\n  sw_count = 0;\n  while (digitalRead(LED_SW) == LOW) {\n    sw_count++;\n    if (sw_count &gt; 50) {\n      if (mode == 1) {    \/\/ \u65b0\u30e2\u30fc\u30c9\u306f\u30d5\u30a9\u30fc\u30ab\u30b9\u5236\u5fa1\n        digitalWrite(LED_Red, HIGH);\n        digitalWrite(LED_Green, LOW);\n      } else {            \/\/ \u65b0\u30e2\u30fc\u30c9\u306f\u7d5e\u308a\u5236\u5fa1\n        digitalWrite(LED_Green, HIGH);\n        digitalWrite(LED_Red, LOW);\n      }\n    }\n    delay(10);\n  }\n  delay(100);\n  if (sw_count &gt; 50) {\n    if (mode == 0) {\n      mode = 1;   \/\/ \u7d5e\u308a\u30e2\u30fc\u30c9\n      digitalWrite(LED_Green, HIGH);\n      digitalWrite(LED_Red, LOW);\n    } else {\n      mode = 0;   \/\/ \u30d5\u30a9\u30fc\u30ab\u30b9\u30e2\u30fc\u30c9\n      digitalWrite(LED_Red, HIGH);\n      digitalWrite(LED_Green, LOW);\n    }\n  }\n  if (sw_count != 0 &amp;&amp; (sw_count &lt; 50) ) {\n    if  (mode == 0 ) { \/\/ Send command to LENS\u3000\u30d5\u30a9\u30fc\u30ab\u30b9\n      targetPos =  mode_counter&#91;mode] ;\n      offset = mode_counter&#91;mode] ;\n      x = highByte(offset);\n      y = lowByte(offset);\n      InitLens();\n      IsMoving = true;\n      Serial.print(offset); Serial.print(\",\");\n      Serial.print(x); Serial.print(\",\");\n      Serial.println(y);\n      SPI.transfer(68);       delay(30);\n      SPI.transfer(x);        delay(30);\n      SPI.transfer(y);        delay(30);\n      SPI.transfer(0);        delay(100);\n      IsMoving = false;\n      focuserPosition = targetPos;\n    } else {              \/\/ \u7d5e\u308a\n      apValue = mode_counter&#91;mode] % 20;\n      if (apValue != EEPROM.read(apAddr))\n      {\n        InitLens();\n        Serial.println(\"AP\");\n        SPI.transfer(0x07);          delay(10);\n        SPI.transfer(0x13);          delay(10);\n        SPI.transfer((apValue - EEPROM.read(apAddr)) * 3);\n        delay(100);\n        SPI.transfer(0x08);          delay(10);\n        SPI.transfer(0x00);          delay(10);\n        EEPROM.write(apAddr, apValue);\n      }\n    }\n  }\n\n  counter_now = ENC_COUNT(mode_counter&#91;mode]);\n  if (mode_counter&#91;mode] != counter_now)\n  {\n    mode_counter&#91;mode] = counter_now;\n  }\n  disp_update();\n}\n\nvoid disp_update() {\n  display.clearDisplay();\n  display.setCursor(0, 10);\n  display.print(\" F:\");\n  display.println( mode_counter&#91;0] );\n  display.print(\" A:\");\n  display.println(mode_counter&#91;1]);\n  display.display();\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Arduino\u3067EF\u30ec\u30f3\u30ba\u3092\u5236\u5fa1\u3059\u308b\u5b9f\u9a13\u306e\u30e1\u30e2\u3067\u3059\u3002\u30ab\u30e1\u30e9\u30ec\u30f3\u30ba\u3067\u661f\u96f2\u306a\u3069\u3092\u64ae\u5f71\u3057\u3088\u3046\u3068\u3059\u308b\u3068\u3001\u624b\u52d5\u3067\u30d4\u30f3\u30c8\u3092\u5408\u308f\u305b\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u5fae\u5999\u306a\u64cd\u4f5c\u304c\u5fc5\u8981\u3067\u306a\u304b\u306a\u304b\u30d4\u30f3\u30c8\u3092\u5408\u308f\u305b\u308b\u306e\u306b\u82e6\u52b4\u3057\u307e\u3059\u3002\u305d\u3053\u3067\u3001\u30b9\u30c6\u30c3\u30d4\u30f3\u30b0\u30e2\u30fc\u30bf [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2,6],"tags":[],"class_list":["post-18","post","type-post","status-publish","format-standard","hentry","category-camera","category-make"],"featured_image_src":null,"author_info":{"display_name":"mars","author_link":"https:\/\/rfsec.ddns.net\/db\/?author=1"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/18","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=18"}],"version-history":[{"count":1,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/18\/revisions"}],"predecessor-version":[{"id":52,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/18\/revisions\/52"}],"wp:attachment":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=18"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=18"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=18"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}