{"id":5362,"date":"2014-07-13T18:05:39","date_gmt":"2014-07-13T09:05:39","guid":{"rendered":"http:\/\/mkusunoki.net\/?p=5362"},"modified":"2014-07-13T18:07:09","modified_gmt":"2014-07-13T09:07:09","slug":"iv-27m-%e8%9b%8d%e5%85%89%e8%a1%a8%e7%a4%ba%e7%ae%a1%e3%82%92-arduino-%e3%81%a7%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b%e3%80%82","status":"publish","type":"post","link":"https:\/\/mkusunoki.net\/?p=5362","title":{"rendered":"IV-27M \u86cd\u5149\u8868\u793a\u7ba1\u3092 Arduino \u3067\u52d5\u304b\u3057\u3066\u307f\u308b\u3002"},"content":{"rendered":"<p>\n\u571f\u66dc\u65e5\u306b\u57fa\u672c\u306e\u70b9\u706f\u307e\u3067\u884c\u3044\u307e\u3057\u305f IV-27M \u86cd\u5149\u8868\u793a\u7ba1\u3067\u3059\u304c\u3001\u30b7\u30d5\u30c8\u30ec\u30b8\u30b9\u30bf\u306b\u30c7\u30fc\u30bf\u6d41\u3059\u9806\u756a\u3068\u304b\u306e\u6574\u7406\u3082\u304b\u306d\u3066\u914d\u7dda\u3092\u4e00\u90e8\u3084\u308a\u306a\u304a\u3057\u307e\u3057\u305f\u3002\u3068\u308a\u3042\u3048\u305a\u30d6\u30ec\u30c3\u30c9\u30dc\u30fc\u30c9\u306b\u4e57\u3063\u3066\u3044\u308b\u90e8\u54c1\u304b\u3089\u4e0b\u8a18\u306e\u56de\u8def\u56f3\u3092\u66f8\u304d\u51fa\u3057\u3082\u3057\u307e\u3057\u305f\u3002\n<\/p>\n<p><a href=\"http:\/\/mkusunoki.net\/?attachment_id=5363\" rel=\"attachment wp-att-5363\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mkusunoki.net\/wp\/wp-content\/uploads\/2014\/07\/IV-27M-CLOCK01-1024x975.png\" alt=\"IV-27M CLOCK01\" width=\"1024\" height=\"975\" class=\"alignnone size-medium wp-image-5363\" srcset=\"https:\/\/mkusunoki.net\/wp\/wp-content\/uploads\/2014\/07\/IV-27M-CLOCK01-1024x975.png 1024w, https:\/\/mkusunoki.net\/wp\/wp-content\/uploads\/2014\/07\/IV-27M-CLOCK01-320x304.png 320w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<p>\n\u3053\u308c\u306b\u3001Arduino UNO \u3092\u63a5\u7d9a\u3057\u307e\u3057\u3066\u3001\u30b7\u30ea\u30a2\u30eb\u30dd\u30fc\u30c8\u304b\u3089\u53d7\u4fe1\u3057\u305f\u6570\u5b57\u3092\u8868\u793a\u3059\u308b\u3088\u3046\u306b\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u6210\u3002\u3053\u308c\u306f\u3001\u4ed5\u8fbc\u3093\u3067\u304a\u304d\u305f\u304b\u3063\u305f\u6a5f\u80fd\u3067\u3001\u30b4\u30fc\u30b9\u30c8\u78ba\u8a8d\u7528\u306b\u6570\u6587\u5b57\u304a\u304d\u306b\u8868\u793a\u3068\u304b\u3057\u305f\u3044\u3068\u304d\u306a\u3069\u4fbf\u5229\u3067\u3059\u3002<br \/>\n24V \u3067\u306f\u30d6\u30e9\u30f3\u30ad\u30f3\u30b0\u30bf\u30a4\u30e0\u5165\u308c\u3066\u306a\u3044\u72b6\u614b\u3067\u3082\u30b4\u30fc\u30b9\u30c8\u307b\u3068\u3093\u3069\u51fa\u3066\u306a\u3044\u3067\u3059\u304c\u300124V \u306e\u96fb\u6e90\u3092\u3082\u3046\u5c11\u3057\u3042\u3052\u3066\u307f\u305f\u3089\u30cf\u30c3\u30ad\u30ea\u51fa\u308b\u304b\u3082\u77e5\u308c\u306a\u3044\u306e\u3067\u3001\u4e00\u5fdc\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002\n<\/p>\n<p>[vine url=&#8221;https:\/\/vine.co\/v\/MxXXwtDiqDg&#8221;]<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;SPI.h&gt;\r\n#include &lt;stdio.h&gt;\r\n#include &lt;string.h&gt;\r\n\r\n\/* ------------------------------------------------------------\r\n -- Grobal Variables\r\n ------------------------------------------------------------ *\/\r\nunsigned int msCount = 0;\r\nboolean msCountOVF;\r\nunsigned char vfdDigit = 0;\r\nunsigned char vfdSeg&#x5B;14];\r\nunsigned char vfdDot&#x5B;14];\r\nchar str01&#x5B;20];\r\n\r\nString inputString = &quot;&quot;;     \/\/ a string to hold incoming data\r\nboolean stringComplete = false;  \/\/ whether the string is complete\r\n\r\n\r\n\/* ------------------------------------------------------------\r\n -- Interrupt hundler (every 0.5ms)\r\n ------------------------------------------------------------ *\/\r\nISR(TIMER2_COMPA_vect) {\r\n\r\n  sendVfd();\r\n  msCount++;\r\n  if(msCount &gt;= 2000) {  \/\/ 1seconds \r\n    msCount = 0;\r\n    msCountOVF = true;\r\n  }\r\n  \/\/ Reset interrupt flag and counter.\r\n  TIFR2 &amp;= ~(1&lt;&lt;OCF2A);\r\n}\r\n\r\n\/* ------------------------------------------------------------\r\n -- Initial Setup\r\n ------------------------------------------------------------ *\/\r\nvoid setup() {\r\n\r\n  pinMode(4, OUTPUT);  \/\/ SCLR\r\n  pinMode(5, OUTPUT);  \/\/ RCK\r\n\r\n  \/\/ initialize SPI\r\n  SPI.begin();\r\n  SPI.setClockDivider(SPI_CLOCK_DIV2);\r\n  SPI.setDataMode(SPI_MODE0);\r\n  SPI.setBitOrder(MSBFIRST);\r\n\r\n  \/\/\r\n  Serial.begin(9600);\r\n\r\n  \/\/ Setup TIMER2\r\n  \/\/ a. Disable the Timer\/Counter2 interrupts by clearing OCIE2x and TOIE2.\r\n  \/\/ b. Select clock source by setting AS2 as appropriate.\r\n  \/\/ c. Write new values to TCNT2, OCR2x, and TCCR2x.\r\n  \/\/ d. To switch to asynchronous operation: Wait for TCN2xUB, OCR2xUB, and TCR2xUB.\r\n  \/\/ e. Clear the Timer\/Counter2 Interrupt Flags.\r\n  \/\/ f. Enable interrupts, if needed.\r\n\r\n  \/\/ TIMSK2 2=OCIE2B 1=OCIE2A 0=TOIE2\r\n  \/\/ Disable interrupt enable\r\n  TIMSK2 &amp;= ~(1&lt;&lt;OCIE2B);\r\n  TIMSK2 &amp;= ~(1&lt;&lt;OCIE2A);\r\n  TIMSK2 &amp;= ~(1&lt;&lt;TOIE2);\r\n  \/\/ ASSR \u2013 Asynchronous Status Register\r\n  \/\/ 6=EXCLK 5=AS2 4=TCN2UB 3=OCR2AUB 2=OCR2BUB 1=TCR2AUB 0=TCR2BUB  \r\n  \/\/ AS2=0 CLKIO,  AS2=1 TOSC1\r\n  ASSR &amp;= ~(1&lt;&lt;AS2);\r\n  \/\/ Waveform Generation Mode set to NORMAL mode WGM22,21,20=0\r\n  TCCR2A &amp;= ~(1&lt;&lt;WGM20);\r\n  TCCR2A |= (1&lt;&lt;WGM21);\r\n  TCCR2B &amp;= ~(1&lt;&lt;WGM22);\r\n  \/\/ TCCR2B \u2013 Timer\/Counter Control Register B\r\n  \/\/ 7=FOC2A 6=FOC2B 3=WGM22 2=CS22 1=CS21 0=CS20\r\n  \/\/ CS22 CS21 CS20 Description\r\n  \/\/ 0    0    0    No clock source (Timer\/Counter stopped).\r\n  \/\/ 0    0    1    clkT2S\/(No prescaling)\r\n  \/\/ 0    1    0    clkT2S\/8 (From prescaler)\r\n  \/\/ 0    1    1    clkT2S\/32 (From prescaler)\r\n  \/\/ 1    0    0    clkT2S\/64 (From prescaler)\r\n  \/\/ 1    0    1    clkT2S\/128 (From prescaler)\r\n  \/\/ 1    1    0    clkT2S\/256 (From prescaler)\r\n  \/\/ 1    1    1    clkT2S\/1024 (From prescaler)\r\n  TCCR2B |= (1&lt;&lt;CS22);\r\n  TCCR2B &amp;= ~(1&lt;&lt;CS21);\r\n  TCCR2B &amp;= ~(1&lt;&lt;CS20);\r\n  TCNT2 = 0;\r\n  OCR2A = 124; \/\/ 16MHz \/ 64 = 4us. 4us * 125 = 0.5ms\r\n  \/\/ Clear interrupt flag\r\n  \/\/ TIFR2 \u2013 Timer\/Counter2 Interrupt Flag Register\r\n  \/\/ 2=OCF2B 1=OCF2A 0=TOV2\r\n  TIFR2 &amp;= ~(1&lt;&lt;OCF2A);\r\n  \/\/ TIMSK2 2=OCIE2B 1=OCIE2A 0=TOIE2\r\n  \/\/ Enable interrupt\r\n  TIMSK2 |= (1&lt;&lt;OCIE2A);\r\n}\r\n\r\n\/* ------------------------------------------------------------\r\n -- Main loop\r\n ------------------------------------------------------------ *\/\r\nvoid loop() {\r\n\r\n  int i;\r\n  int charLen;\r\n  \/\/ serial input done\r\n  \/\/ 9600 bps\r\n  \/\/ help&amp;#91;RET&amp;#93; -&gt; print help message\r\n  \/\/ HH MM SS&#x5B;RET] -&gt; set time\r\n  \/\/\r\n  if (stringComplete == true) {\r\n    \/\/Serial.println(inputString); \r\n    if(inputString.equals(&quot;help\\r&quot;)) {\r\n      Serial.println(&quot;help: I&#039;m alive&quot;);\r\n    } \r\n    else {\r\n      for(i = 0; i &lt; 14; i++) {\r\n        vfdSeg&amp;#91;i&amp;#93; = 0;\r\n        str01&amp;#91;i&amp;#93; = 0;\r\n      }\r\n      charLen = inputString.length();\r\n      if(charLen &gt; 15) {\r\n        charLen = 15;\r\n      }\r\n      inputString.toCharArray(str01, charLen);\r\n      for(i = 0; i &lt; 14; i++) {\r\n        convVfdSeg(i);\r\n      }\r\n    }\r\n    inputString = &quot;&quot;;\r\n    stringComplete = false;\r\n  }\r\n\r\n}\r\n\r\n\/* ------------------------------------------------------------\r\n -- sendVfd\r\n ------------------------------------------------------------ *\/\r\nvoid sendVfd() {\r\n\r\n  unsigned int vfdBit;\r\n  unsigned char vfdBitH;\r\n  unsigned char vfdBitL;\r\n\r\n  \/\/ HC595 SCLR(negedge: shift register clear)\r\n  digitalWrite(4,LOW);\r\n  digitalWrite(4,HIGH);  \r\n\r\n  \/\/ HC595 RCK (posedge: data latch)\r\n  digitalWrite(5,LOW);\r\n  digitalWrite(5,HIGH);\r\n\r\n  \/\/ send to shift register\r\n  vfdBit = (1 &lt;&lt; vfdDigit);\r\n  vfdBitL = vfdBit &amp; 0x00FF;\r\n  vfdBitH = (vfdBit &gt;&gt; 8);\r\n  \/\/if(vfdDot&#x5B;vfdDigit] != 0) {\r\n  \/\/  digit |= 0x80;\r\n  \/\/ }\r\n\r\n  SPI.transfer(vfdBitH);\r\n  SPI.transfer(vfdBitL);\r\n  SPI.transfer(vfdSeg&#x5B;vfdDigit]);  \r\n\r\n\r\n  \/\/ HC595 RCK (posedge: data latch)\r\n  digitalWrite(5,LOW);\r\n  digitalWrite(5,HIGH);  \r\n\r\n  vfdDigit++;\r\n  if(vfdDigit &gt; 13) {\r\n    vfdDigit = 0;\r\n  }\r\n}\r\n\r\n\/* ------------------------------------------------------------\r\n -- sendVfd\r\n ------------------------------------------------------------ *\/\r\nvoid convVfdSeg(int digit) {\r\n\r\n  switch(str01&#x5B;digit]) {\r\n  case &#039;0&#039;: \r\n    vfdSeg&#x5B;digit] = 0xFC; \r\n    break;\r\n  case &#039;1&#039;: \r\n    vfdSeg&#x5B;digit] = 0x60; \r\n    break;\r\n  case &#039;2&#039;: \r\n    vfdSeg&#x5B;digit] = 0xda; \r\n    break;\r\n  case &#039;3&#039;: \r\n    vfdSeg&#x5B;digit] = 0xf2; \r\n    break;\r\n  case &#039;4&#039;: \r\n    vfdSeg&#x5B;digit] = 0x66; \r\n    break;\r\n  case &#039;5&#039;: \r\n    vfdSeg&#x5B;digit] = 0xb6; \r\n    break;\r\n  case &#039;6&#039;: \r\n    vfdSeg&#x5B;digit] = 0xbe; \r\n    break;\r\n  case &#039;7&#039;: \r\n    vfdSeg&#x5B;digit] = 0xe0; \r\n    break;\r\n  case &#039;8&#039;: \r\n    vfdSeg&#x5B;digit] = 0xfe; \r\n    break;\r\n  case &#039;9&#039;: \r\n    vfdSeg&#x5B;digit] = 0xe6; \r\n    break;\r\n  case &#039;-&#039;: \r\n    vfdSeg&#x5B;digit] = 0x02; \r\n    break;\r\n  }\r\n}\r\n\r\n\r\n\/*\r\n  SerialEvent occurs whenever a new data comes in the\r\n hardware serial RX.  This routine is run between each\r\n time loop() runs, so using delay inside loop can delay\r\n response.  Multiple bytes of data may be available.\r\n *\/\r\nvoid serialEvent() {\r\n  while (Serial.available()) {\r\n    \/\/ get the new byte:\r\n    char inChar = (char)Serial.read(); \r\n    \/\/ add it to the inputString:\r\n    inputString += inChar;\r\n    Serial.write(inChar);\r\n    \/\/ if the incoming character is a newline, set a flag\r\n    \/\/ so the main loop can do something about it:\r\n    if (inChar == &#039;\\r&#039;) {\r\n      stringComplete = true;\r\n      Serial.write(&#039;\\r&#039;);\r\n      Serial.write(&#039;\\n&#039;);\r\n    } \r\n  }\r\n}\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u571f\u66dc\u65e5\u306b\u57fa\u672c\u306e\u70b9\u706f\u307e\u3067\u884c\u3044\u307e\u3057\u305f IV-27M \u86cd\u5149\u8868\u793a\u7ba1\u3067\u3059\u304c\u3001\u30b7\u30d5\u30c8\u30ec\u30b8\u30b9\u30bf\u306b\u30c7\u30fc\u30bf\u6d41\u3059\u9806\u756a\u3068\u304b\u306e\u6574\u7406\u3082\u304b\u306d\u3066\u914d\u7dda\u3092\u4e00\u90e8\u3084\u308a\u306a\u304a\u3057\u307e\u3057\u305f\u3002\u3068\u308a\u3042\u3048\u305a\u30d6\u30ec\u30c3\u30c9\u30dc\u30fc\u30c9\u306b\u4e57\u3063\u3066\u3044\u308b\u90e8\u54c1\u304b\u3089\u4e0b\u8a18\u306e\u56de\u8def\u56f3\u3092\u66f8\u304d\u51fa\u3057\u3082\u3057\u307e\u3057\u305f\u3002 &hellip; <a href=\"https:\/\/mkusunoki.net\/?p=5362\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;IV-27M \u86cd\u5149\u8868\u793a\u7ba1\u3092 Arduino \u3067\u52d5\u304b\u3057\u3066\u307f\u308b\u3002&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[7],"tags":[107,290,58],"class_list":["post-5362","post","type-post","status-publish","format-standard","hentry","category-kousaku","tag-arduino-uno","tag-iv-27","tag-vfd"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mkusunoki.net\/index.php?rest_route=\/wp\/v2\/posts\/5362","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mkusunoki.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mkusunoki.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mkusunoki.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mkusunoki.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5362"}],"version-history":[{"count":2,"href":"https:\/\/mkusunoki.net\/index.php?rest_route=\/wp\/v2\/posts\/5362\/revisions"}],"predecessor-version":[{"id":5365,"href":"https:\/\/mkusunoki.net\/index.php?rest_route=\/wp\/v2\/posts\/5362\/revisions\/5365"}],"wp:attachment":[{"href":"https:\/\/mkusunoki.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mkusunoki.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mkusunoki.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}