<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: sago35</title>
    <description>The latest articles on DEV Community by sago35 (@sago35).</description>
    <link>https://dev.to/sago35</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F382390%2F07ebdd06-44d1-4cbd-aca8-2d0bf173bdde.png</url>
      <title>DEV Community: sago35</title>
      <link>https://dev.to/sago35</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sago35"/>
    <language>en</language>
    <item>
      <title>Introduction to the event "TinyGo Keeb Tour 2024"</title>
      <dc:creator>sago35</dc:creator>
      <pubDate>Tue, 05 Nov 2024 01:49:30 +0000</pubDate>
      <link>https://dev.to/sago35/introduction-to-the-event-tinygo-keeb-tour-2024-2n0c</link>
      <guid>https://dev.to/sago35/introduction-to-the-event-tinygo-keeb-tour-2024-2n0c</guid>
      <description>&lt;p&gt;This article introduces an event held in Japan. This is basically a translation of the following post, originally written in Japanese, into English.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sago35.hatenablog.com/entry/2024/10/29/095629" rel="noopener noreferrer"&gt;https://sago35.hatenablog.com/entry/2024/10/29/095629&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the TinyGo Keeb Tour 2024?
&lt;/h2&gt;

&lt;p&gt;The TinyGo Keeb Tour 2024 is a hands-on workshop event combining TinyGo and DIY keyboards. Participants spend the morning soldering, followed by a software hands-on session in the afternoon. Don’t worry if you’re new to soldering—tools are provided, and staff are on hand to help.&lt;/p&gt;

&lt;p&gt;It's exciting to see a keyboard you've built yourself working on a computer! The project for the event is the zero-kb02 macro pad (12 keys + joystick + rotary encoder + display). Besides functioning as a keyboard or macro pad, it can also serve as a development board for TinyGo with additional ports for various uses. With one of these, you can enjoy a variety of projects.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1812817785573232674-192" src="https://platform.twitter.com/embed/Tweet.html?id=1812817785573232674"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1812817785573232674-192');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1812817785573232674&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Follow event information on Connpass:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tinygo-keeb.connpass.com/" rel="noopener noreferrer"&gt;https://tinygo-keeb.connpass.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Workshop materials and build guides are available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sago35/tinygo_keeb_workshop_2024" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo_keeb_workshop_2024&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For support and communication before, during, and after the event, join us on Discord:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discord.gg/GKFsRXNRsX" rel="noopener noreferrer"&gt;https://discord.gg/GKFsRXNRsX&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Beginning
&lt;/h2&gt;

&lt;p&gt;On June 13, 2024, this tour started with a small team: &lt;a href="https://x.com/micchiebear" rel="noopener noreferrer"&gt;micchie&lt;/a&gt;, &lt;a href="https://x.com/ysaito8015" rel="noopener noreferrer"&gt;ysaito&lt;/a&gt;, &lt;a href="https://x.com/taknb2nch" rel="noopener noreferrer"&gt;taknb2nch&lt;/a&gt;, and &lt;a href="https://x.com/sago35tk" rel="noopener noreferrer"&gt;sago35&lt;/a&gt;. Many more staff members joined in as the project grew—thanks to everyone for their hard work!&lt;/p&gt;

&lt;p&gt;The first kickoff meeting was scheduled for July 1, 2024. Before that date, we focused on designing and ordering the PCBs, with the current version finalized by June 16. The PCB design includes a matrix layout, and we ensured a display was included to make it fully enjoyable with TinyGo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsvjcpqtma4mmr8erx23x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsvjcpqtma4mmr8erx23x.jpg" alt="board image" width="680" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfge1myi5j1k9my0i75m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfge1myi5j1k9my0i75m.jpg" alt="first try" width="680" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Traveling Across Regions
&lt;/h2&gt;

&lt;p&gt;The 2024 tour covered four regions:&lt;/p&gt;

&lt;h3&gt;
  
  
  August 4, 2024 - Kobe with KOBE.go
&lt;/h3&gt;

&lt;p&gt;Our first event! After deciding on the Kanto event on August 26, we organized a trial run in Kobe without soldering. We gathered at a hack bar, enjoyed drinks, and dived into the hands-on workshop, establishing a good flow for future sessions.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1819986841254461926-188" src="https://platform.twitter.com/embed/Tweet.html?id=1819986841254461926"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1819986841254461926-188');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1819986841254461926&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1820110456859812118-145" src="https://platform.twitter.com/embed/Tweet.html?id=1820110456859812118"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1820110456859812118-145');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1820110456859812118&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  August 26, 2024 - Kanto with Women Who Go Tokyo
&lt;/h3&gt;

&lt;p&gt;This event included soldering. We found a suitable venue and borrowed equipment like soldering irons from &lt;a href="https://x.com/Hakko_Corp" rel="noopener noreferrer"&gt;HAKKO&lt;/a&gt; and &lt;a href="https://x.com/nanbuwks" rel="noopener noreferrer"&gt;nanbuwks&lt;/a&gt;. Despite being new to teaching soldering, we managed successfully.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1827570363586507013-23" src="https://platform.twitter.com/embed/Tweet.html?id=1827570363586507013"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1827570363586507013-23');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1827570363586507013&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8m4dtpgtsp7ir893zkm7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8m4dtpgtsp7ir893zkm7.jpg" alt="soldering" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There was also a session covering the basics of DIY keyboards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss5ajcpmobzf3mcsbdxf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss5ajcpmobzf3mcsbdxf.jpg" alt="session" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While working through the hands-on activities, participants were free to create whatever they wanted, resulting in some interesting projects.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1827630059580231788-223" src="https://platform.twitter.com/embed/Tweet.html?id=1827630059580231788"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1827630059580231788-223');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1827630059580231788&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1827623944167243924-715" src="https://platform.twitter.com/embed/Tweet.html?id=1827623944167243924"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1827623944167243924-715');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1827623944167243924&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;By the second stop on the tour, we had an official T-shirt. The design features a very long gopher holding an ISO Enter key and a soldering iron—such a cool design!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1827490483171684527-794" src="https://platform.twitter.com/embed/Tweet.html?id=1827490483171684527"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1827490483171684527-794');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1827490483171684527&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  October 12, 2024 - Sendai with Sendai.go
&lt;/h3&gt;

&lt;p&gt;With knowledge accumulated from the first two events, the Sendai session went smoothly. The tour merchandise was expanded to include a tour towel—quite impressive!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1844911820097847705-733" src="https://platform.twitter.com/embed/Tweet.html?id=1844911820097847705"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1844911820097847705-733');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1844911820097847705&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;The soldering process went well, with significant improvements in the steps and documentation based on KPT feedback from previous events. Although there were a few minor issues, things progressed smoothly.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1844920215051829758-683" src="https://platform.twitter.com/embed/Tweet.html?id=1844920215051829758"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1844920215051829758-683');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1844920215051829758&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;We also enjoyed a traditional Imoni-kai (potato stew party)—it was delicious!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1844937065437462537-570" src="https://platform.twitter.com/embed/Tweet.html?id=1844937065437462537"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1844937065437462537-570');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1844937065437462537&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1844944511551910147-74" src="https://platform.twitter.com/embed/Tweet.html?id=1844944511551910147"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1844944511551910147-74');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1844944511551910147&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;In Sendai, participants created a variety of interesting projects, as expected.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1845013834190184448-361" src="https://platform.twitter.com/embed/Tweet.html?id=1845013834190184448"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1845013834190184448-361');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1845013834190184448&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;The addition of the tour towel made for some fantastic photos.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1845018762350563375-221" src="https://platform.twitter.com/embed/Tweet.html?id=1845018762350563375"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1845018762350563375-221');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1845018762350563375&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  October 26, 2024 - Fukuoka with Kizuku.go
&lt;/h3&gt;

&lt;p&gt;The final event of 2024. Documentation was further refined, reducing potential trouble spots.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1849996657875877892-943" src="https://platform.twitter.com/embed/Tweet.html?id=1849996657875877892"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1849996657875877892-943');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1849996657875877892&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Participants mainly followed the build guide on their smartphones or other small devices while working.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1850015908787630157-119" src="https://platform.twitter.com/embed/Tweet.html?id=1850015908787630157"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1850015908787630157-119');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1850015908787630157&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Even if there were any mistakes, the staff was ready to rework them, so participants could feel at ease!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1850026223176696257-875" src="https://platform.twitter.com/embed/Tweet.html?id=1850026223176696257"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1850026223176696257-875');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1850026223176696257&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;We also showcased a new MIDI functionality demo specifically for the Fukuoka event. Afterward, we ended up having a spontaneous MIDI session, practically forgetting about the keyboard hands-on workshop!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1850057554614943908-252" src="https://platform.twitter.com/embed/Tweet.html?id=1850057554614943908"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1850057554614943908-252');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1850057554614943908&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1850083873906176037-211" src="https://platform.twitter.com/embed/Tweet.html?id=1850083873906176037"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1850083873906176037-211');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1850083873906176037&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;To wrap up, we took a final group photo to commemorate the tour.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1850100615810367812-300" src="https://platform.twitter.com/embed/Tweet.html?id=1850100615810367812"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1850100615810367812-300');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1850100615810367812&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the zero-kb02 Hardware Used in the Tour?
&lt;/h2&gt;

&lt;p&gt;The zero-kb02 is a 12-key macro pad specifically designed for the TinyGo Keeb Tour 2024. It includes a rotary encoder and joystick, making it enjoyable for everyday use as a DIY keyboard or macro pad. It also features a screen, allowing it to function as a development board for TinyGo.&lt;/p&gt;

&lt;p&gt;As a demo, we’re developing a 2D game engine called &lt;a href="https://github.com/sago35/koebiten" rel="noopener noreferrer"&gt;Koebiten&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1841091471786852685-809" src="https://platform.twitter.com/embed/Tweet.html?id=1841091471786852685"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1841091471786852685-809');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1841091471786852685&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;For more details on zero-kb02, including the actual PCB data, check here. Since it's open-source, you’re free to order it yourself or 3D print a case.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sago35" rel="noopener noreferrer"&gt;
        sago35
      &lt;/a&gt; / &lt;a href="https://github.com/sago35/keyboards" rel="noopener noreferrer"&gt;
        keyboards
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;keyboards&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This repository was created to manage the circuitry and firmware for the keyboards I designed.&lt;br&gt;
The firmware is created using &lt;a href="https://github.com/sago35/tinygo-keyboard" rel="noopener noreferrer"&gt;sago35/tinygo-keyboard&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;sg24&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sago35/keyboards./images/sg24.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsago35%2Fkeyboards.%2Fimages%2Fsg24.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2Fsago35%2Fkeyboards%2Ftree%2Fmain%2Fsg24%2Fsg24" rel="nofollow noopener noreferrer"&gt;kicanvas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;zero-kb02/&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sago35/keyboards./images/zero-kb02.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsago35%2Fkeyboards.%2Fimages%2Fzero-kb02.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2Fsago35%2Fkeyboards%2Ftree%2Fmain%2Fzero-kb02%2Fzero-kb02" rel="nofollow noopener noreferrer"&gt;kicanvas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/keyboards./zero-kb02/stl/" rel="noopener noreferrer"&gt;case (stl / 3mf)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;workshop - &lt;a href="https://github.com/sago35/tinygo_keeb_workshop_2024" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo_keeb_workshop_2024&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;pinout&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sago35/keyboards./images/pinout01.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsago35%2Fkeyboards.%2Fimages%2Fpinout01.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sago35/keyboards./images/pinout02.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsago35%2Fkeyboards.%2Fimages%2Fpinout02.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Pin&lt;/th&gt;
&lt;th&gt;Info&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VR_BTN&lt;/td&gt;
&lt;td&gt;machine.GPIO0&lt;/td&gt;
&lt;td&gt;InputPullup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WS2812&lt;/td&gt;
&lt;td&gt;machine.GPIO1&lt;/td&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROT_BTN1&lt;/td&gt;
&lt;td&gt;machine.GPIO2&lt;/td&gt;
&lt;td&gt;InputPullup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROT_A1&lt;/td&gt;
&lt;td&gt;machine.GPIO3&lt;/td&gt;
&lt;td&gt;InputPullup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROT_B1&lt;/td&gt;
&lt;td&gt;machine.GPIO4&lt;/td&gt;
&lt;td&gt;InputPullup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COL1&lt;/td&gt;
&lt;td&gt;machine.GPIO5&lt;/td&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COL2&lt;/td&gt;
&lt;td&gt;machine.GPIO6&lt;/td&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COL3&lt;/td&gt;
&lt;td&gt;machine.GPIO7&lt;/td&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COL4&lt;/td&gt;
&lt;td&gt;machine.GPIO8&lt;/td&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROW1&lt;/td&gt;
&lt;td&gt;machine.GPIO9&lt;/td&gt;
&lt;td&gt;InputPulldown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROW2&lt;/td&gt;
&lt;td&gt;machine.GPIO10&lt;/td&gt;
&lt;td&gt;InputPulldown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROW3&lt;/td&gt;
&lt;td&gt;machine.GPIO11&lt;/td&gt;
&lt;td&gt;InputPulldown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDA0_TX0&lt;/td&gt;
&lt;td&gt;machine.GPIO12&lt;/td&gt;
&lt;td&gt;I2C SDA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCL0_RX0&lt;/td&gt;
&lt;td&gt;machine.GPIO13&lt;/td&gt;
&lt;td&gt;I2C SCL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EX01&lt;/td&gt;
&lt;td&gt;machine.GPIO14&lt;/td&gt;
&lt;td&gt;GPIO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EX02&lt;/td&gt;
&lt;td&gt;machine.GPIO14&lt;/td&gt;
&lt;td&gt;GPIO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EX03&lt;/td&gt;
&lt;td&gt;machine.GPIO14&lt;/td&gt;
&lt;td&gt;GPIO / ADC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EX04&lt;/td&gt;
&lt;td&gt;machine.GPIO14&lt;/td&gt;
&lt;td&gt;GPIO / ADC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VR_Y&lt;/td&gt;
&lt;td&gt;machine.GPIO28&lt;/td&gt;
&lt;td&gt;ADC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VR_X&lt;/td&gt;
&lt;td&gt;machine.GPIO29&lt;/td&gt;
&lt;td&gt;ADC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sago35/keyboards" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  The Nature of a Tour
&lt;/h2&gt;

&lt;p&gt;Since this is a multi-event tour with the same theme, we’ve been able to gradually improve various aspects over time. For example, we’ve added notes to highlight common soldering mistakes and clarified the front and back sides of the PCB to prevent confusion. We also addressed questions like “How can I display Japanese fonts on the screen?” by adding relevant instructions to the workshop materials.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1846853358067356079-694" src="https://platform.twitter.com/embed/Tweet.html?id=1846853358067356079"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1846853358067356079-694');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1846853358067356079&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributions
&lt;/h2&gt;

&lt;p&gt;The event has inspired contributions to both the TinyGo core and the hands-on workshop materials, which is fantastic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TinyGo Core

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tinygo-org/tinygo/issues/4519" rel="noopener noreferrer"&gt;https://github.com/tinygo-org/tinygo/issues/4519&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Hands-On Materials

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/tinygo_keeb_workshop_2024/pulls?q=is%3Apr+is%3Aclosed" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo_keeb_workshop_2024/pulls?q=is%3Apr+is%3Aclosed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Upcoming Plans
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Planning an Online Event for Year-End
&lt;/h3&gt;

&lt;p&gt;We’d like to hold an online event by the end of the year for people who already own a zero-kb02 or those interested in TinyGo embedded development. Stay tuned!&lt;/p&gt;

&lt;h3&gt;
  
  
  Interested in Hosting an Event in Your Area?
&lt;/h3&gt;

&lt;p&gt;We’re looking for locations to host events in 2025 and beyond. If you’re interested, please reach out to the staff (micchie, ysaito, sago35, etc.). If there’s a local Go community, we’d love to collaborate with them as well.&lt;/p&gt;

&lt;p&gt;Currently, the approach is to let local organizers handle venue selection. Events without soldering are possible (like the initial event in Kobe), but soldering is preferred if possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The TinyGo Keeb Tour Continues in 2025
&lt;/h2&gt;

&lt;p&gt;The first event of 2025 is scheduled for January 13 in Takamatsu, Kagawa. We’re also considering additional locations as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtnf3epahlxpwvwxidy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtnf3epahlxpwvwxidy7.png" alt="TinyGo Keeb Tour 2025 plan" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TinyGo Conf!
&lt;/h2&gt;

&lt;p&gt;We’re also planning a TinyGo event called TinyGo Conf in Japan.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Closing
&lt;/h2&gt;

&lt;p&gt;Thank you to all participants, the staff, and especially micchie, ysaito, and taknb2nch for starting this tour. We look forward to TinyGo Keeb Tour 2025!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://tinygo-keeb.connpass.com/" rel="noopener noreferrer"&gt;TinyGo Keeb Tour on Connpass&lt;/a&gt; (ha&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/tinygo_keeb_workshop_2024" rel="noopener noreferrer"&gt;Workshop Guide on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tinygo.org/" rel="noopener noreferrer"&gt;TinyGo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/sago35/create-your-own-keyboard-with-sago35tinygo-keyboard-4gbjhttps://dev.to/sago35/create-your-own-keyboard-with-sago35tinygo-keyboard-4gbj"&gt;Create Your Own Keyboard with sago35/tinygo-keyboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>go</category>
      <category>tinygo</category>
      <category>keyboard</category>
    </item>
    <item>
      <title>Create Your Own Keyboard with sago35/tinygo-keyboard</title>
      <dc:creator>sago35</dc:creator>
      <pubDate>Fri, 01 Mar 2024 00:55:19 +0000</pubDate>
      <link>https://dev.to/sago35/create-your-own-keyboard-with-sago35tinygo-keyboard-4gbj</link>
      <guid>https://dev.to/sago35/create-your-own-keyboard-with-sago35tinygo-keyboard-4gbj</guid>
      <description>&lt;p&gt;This article compiles information on creating a custom keyboard using TinyGo + Wio Terminal with sago35/tinygo-keyboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpb4h2ppvlv0003uoo1cw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpb4h2ppvlv0003uoo1cw.png" alt="keyboard" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;sago35/tinygo-keyboard is a package for building custom keyboards with TinyGo. It includes features such as layer support, various switch reading methods, and Vial compatibility.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sago35" rel="noopener noreferrer"&gt;
        sago35
      &lt;/a&gt; / &lt;a href="https://github.com/sago35/tinygo-keyboard" rel="noopener noreferrer"&gt;
        tinygo-keyboard
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      USB HID keyboard firmware for tinygo
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;USB HID Keyboard firmware for TinyGo&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The API is not yet fixed.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sago35/tinygo-keyboard./img/top.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsago35%2Ftinygo-keyboard.%2Fimg%2Ftop.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The following are supported.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;key input
&lt;ul&gt;
&lt;li&gt;squared matrix scan&lt;/li&gt;
&lt;li&gt;matrix scan&lt;/li&gt;
&lt;li&gt;duplex-matrix scan&lt;/li&gt;
&lt;li&gt;rotary encoder&lt;/li&gt;
&lt;li&gt;GPIO&lt;/li&gt;
&lt;li&gt;UART&lt;/li&gt;
&lt;li&gt;Shifter (tinygo.org/x/drivers/shifter)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;layer feature by mod key&lt;/li&gt;
&lt;li&gt;mouse click / mouse wheel&lt;/li&gt;
&lt;li&gt;support TRRS (UART)&lt;/li&gt;
&lt;li&gt;support &lt;a href="https://vial.rocks/" rel="nofollow noopener noreferrer"&gt;Vial&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Keymap&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://get.vial.today/manual/layers.html" rel="nofollow noopener noreferrer"&gt;Layers&lt;/a&gt; (MO(x), TO(x))&lt;/li&gt;
&lt;li&gt;Matrix testers&lt;/li&gt;
&lt;li&gt;&lt;a href="https://get.vial.today/manual/macros.html" rel="nofollow noopener noreferrer"&gt;Macros&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Microcontrollers&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The following microcontrollers are supported.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rp2040&lt;/li&gt;
&lt;li&gt;nrf52840&lt;/li&gt;
&lt;li&gt;samd51&lt;/li&gt;
&lt;li&gt;samd21&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tutorial&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/tinygo-keyboard./tutorial.md" rel="noopener noreferrer"&gt;tutorial.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Additional Resources&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/sago35/create-your-own-keyboard-with-sago35tinygo-keyboard-4gbj" rel="nofollow"&gt;Create Your Own Keyboard with sago35/tinygo-keyboard (dev.to)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/sago35/items/b008ed03cd403742e7aa" rel="nofollow noopener noreferrer"&gt;自作キーボードをTinyGoで作る (Qiita, Japanese)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;sgkb-0.4.0&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sago35/tinygo-keyboard./img/sgkb-0.3.0.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsago35%2Ftinygo-keyboard.%2Fimg%2Fsgkb-0.3.0.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;# sgkb-0.4.0
$ tinygo flash --target xiao-rp2040 --size short ./targets/sgkb/left/
$ tinygo flash --target xiao-rp2040 --size short ./targets/sgkb/right/

# sgkb-0.3.0 or before
$ tinygo flash --target xiao-rp2040 --size short ./targets/sgkb/left-0.3.0/
$ tinygo flash --target xiao-rp2040 --size short ./targets/sgkb/right/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;files
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/sago35/tinygo-keyboard./kicad/sgkb/" rel="noopener noreferrer"&gt;./kicad/sgkb&lt;/a&gt; for KiCad 7.0
&lt;ul&gt;
&lt;li&gt;KiCanvas : &lt;a href="https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2Fsago35%2Ftinygo-keyboard%2Ftree%2Fsgkb-0.4.0-dev%2Fkicad%2Fsgkb%2Fsgkb" rel="nofollow noopener noreferrer"&gt;sgkb-0.4.0 left&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;KiCanvas : &lt;a href="https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2Fsago35%2Ftinygo-keyboard%2Ftree%2Fmain%2Fkicad%2Fsgkb-right%2Fsgkb-right" rel="nofollow noopener noreferrer"&gt;sgkb-0.4.0 right&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;KiCanvas : &lt;a href="https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2Fsago35%2Ftinygo-keyboard%2Ftree%2Fea336a62da237ce1e1972d8fc5d999a584e267c3%2Fkicad%2Fsgkb%2Fsgkb" rel="nofollow noopener noreferrer"&gt;sgkb-0.3.0 left&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;KiCanvas : &lt;a href="https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2Fsago35%2Ftinygo-keyboard%2Ftree%2Fea336a62da237ce1e1972d8fc5d999a584e267c3%2Fkicad%2Fsgkb-right%2Fsgkb-right" rel="nofollow noopener noreferrer"&gt;sgkb-0.3.0 right&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;amount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cherry MX / Kailh Choc V1&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key cap (1u)&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sago35/tinygo-keyboard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Creating a Go / TinyGo Project
&lt;/h2&gt;

&lt;p&gt;First, run go mod init to create a file called go.mod. This is a common procedure for starting a project in both Go and TinyGo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir mykeyboard

$ cd mykeyboard

$ go mod init main
go: creating new go.mod: module main

$ ls
go.mod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After creating go.mod, you'll need to go get the necessary sago35/tinygo-keyboard. Note that if you go get without specifying a version, it will fetch the latest version at that time, so the version may differ.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ go get github.com/sago35/tinygo-keyboard
go: downloading github.com/sago35/tinygo-keyboard v0.0.0-20240229115423-a1702f57f94c
go: added github.com/sago35/tinygo-keyboard v0.0.0-20240229115423-a1702f57f94c
go: added golang.org/x/exp v0.0.0-20231226003508-02704c960a9b
go: added tinygo.org/x/drivers v0.27.0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Creating the Source Code
&lt;/h2&gt;

&lt;p&gt;Next, import &lt;code&gt;sago35/tinygo-keyboard&lt;/code&gt; and start building your keyboard.&lt;br&gt;
It's a good idea to copy the code around here to use as a template:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/tinygo-keyboard/tree/main/tutorial" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo-keyboard/tree/main/tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/tinygo-keyboard/tree/main/targets" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo-keyboard/tree/main/targets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, we'll create the following source code. The complete source code is available in the basic branch of the following repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/sago35/tinygo-keyboard-examples/tree/basic" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo-keyboard-examples/tree/basic&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"context"&lt;/span&gt;
    &lt;span class="s"&gt;"machine"&lt;/span&gt;

    &lt;span class="n"&gt;keyboard&lt;/span&gt; &lt;span class="s"&gt;"github.com/sago35/tinygo-keyboard"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/sago35/tinygo-keyboard/keycodes/jp"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;gpioPins&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;machine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pin&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;machine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WIO_KEY_A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;machine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WIO_KEY_B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;machine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WIO_KEY_C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;gpioPins&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;gpioPins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;machine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PinConfig&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Mode&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;machine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PinInput&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddGpioKeyboard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gpioPins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[][]&lt;/span&gt;&lt;span class="n"&gt;keyboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Keycode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// layer 0&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyMod1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// layer 1&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Key1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyBackspace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyMod1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Flash
&lt;/h2&gt;

&lt;p&gt;We'll write to the Wio Terminal.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ tinygo flash --target wioterminal --size short .
   code    data     bss |   flash     ram
  39076     684    9316 |   39760   10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Operation Check
&lt;/h2&gt;

&lt;p&gt;After flashing, the buttons at the top of the Wio Terminal will function as follows: respectively, as &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, and &lt;code&gt;Layer 1&lt;/code&gt;. While holding down &lt;code&gt;Layer 1&lt;/code&gt;, it will function as &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;BackSpace&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Explanation of the Source Code
&lt;/h2&gt;

&lt;p&gt;The basic usage of sago35/tinygo-keyboard involves calling &lt;code&gt;keyboard.New()&lt;/code&gt;, adding the desired keyboard type with &lt;code&gt;AddXXXXKeyboard()&lt;/code&gt;, and then calling &lt;code&gt;Loop()&lt;/code&gt;. Since all buttons on the Wio Terminal are directly connected to GPIO pins, we use &lt;code&gt;AddGpioKeyboard()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddGpioKeyboard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gpioPins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[][]&lt;/span&gt;&lt;span class="n"&gt;keyboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Keycode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// layer 0&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyMod1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// layer 1&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Key1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyBackspace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyMod1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The values labeled &lt;code&gt;jp.XXX&lt;/code&gt; above represent key settings.&lt;/p&gt;

&lt;p&gt;Note: Instead of &lt;code&gt;jp.XXX&lt;/code&gt;, you can also use the code from &lt;a href="https://github.com/tinygo-org/tinygo/blob/v0.31.1/src/machine/usb/hid/keyboard/keycode.go" rel="noopener noreferrer"&gt;machine/usb/hid/keyboard/keycode.go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jp.KeyMod1&lt;/code&gt; is a special key used to switch layers. The keys related to layer switching are as follows. Note that for &lt;code&gt;KeyModX&lt;/code&gt;, the same key needs to be assigned to the destination layer.&lt;/p&gt;

&lt;p&gt;In sago35/tinygo-keyboard, you can currently use a total of 6 layers, from layer 0 to 5.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key name&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;KeyMod0&lt;/code&gt; to &lt;code&gt;KeyMod5&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Temporarily switch to layers 0 to 5 while pressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;KeyTo0&lt;/code&gt; to &lt;code&gt;KeyTo5&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Switch to layers 0 to 5 (sticky)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/tinygo-keyboard/blob/main/keycodes/keycodes.go" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo-keyboard/blob/main/keycodes/keycodes.go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Supported Key Inputs by sago35/tinygo-keyboard
&lt;/h2&gt;

&lt;p&gt;sago35/tinygo-keyboard supports the following input methods. Additional formats can be added as needed. Please refer to the circuit diagram for details, as they may differ from common naming conventions.&lt;/p&gt;
&lt;h3&gt;
  
  
  DuplexMatrixKeyboard
&lt;/h3&gt;

&lt;p&gt;This refers to a Duplex Matrix, also known as a Japanese Duplex Matrix, which allows handling twice the input compared to a regular matrix.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AddDuplexMatrixKeyboard(colPins, rowPins []machine.Pin, keys [][]Keycode)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The following circuit is targeted. It is used in targets/sgkb/left-0.3.0 and similar configurations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnz42cvgdkwag6nljfoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnz42cvgdkwag6nljfoq.png" alt="circuit of duplex-matrix" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  GpioKeyboard
&lt;/h3&gt;

&lt;p&gt;This is a keyboard that uses pins directly connected to GPIO. The polarity of button presses can be set using opt.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AddGpioKeyboard(pins []machine.Pin, keys [][]Keycode, opt ...Option)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  MatrixKeyboard
&lt;/h3&gt;

&lt;p&gt;This is probably the most commonly used method in DIY keyboards. By creating rows and columns of pins, you can handle many inputs with few pins. The polarity of diodes can be set using opt.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AddMatrixKeyboard(colPins, rowPins []machine.Pin, keys [][]Keycode, opt ...Option)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The following circuit is targeted. It is used in targets/sgkey and similar configurations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fko3bsze41q8jqadjqzkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fko3bsze41q8jqadjqzkv.png" alt="circuit of matrix" width="563" height="341"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  RotaryKeyboard
&lt;/h3&gt;

&lt;p&gt;This can handle rotary encoders.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AddRotaryKeyboard(rotA, rotB machine.Pin, keys [][]Keycode)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The following circuit is targeted. It is used in targets/xiao-kb01 and macropad-rp2040.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6piyx8wywjbzz2tjnmnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6piyx8wywjbzz2tjnmnw.png" alt="circuit of rotary-encoder" width="391" height="171"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ShifterKeyboard
&lt;/h3&gt;

&lt;p&gt;This can handle shift registers. It was created for the 74165TSSOP (74HC165 compatible?) used in pybadge/gobadge. The polarity of button presses can be set using opt.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AddShifterKeyboard(shifterDevice shifter.Device, keys [][]Keycode, opt ...Option)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  SquaredMatrixKeyboard
&lt;/h3&gt;

&lt;p&gt;This can handle improved squared matrices. It is very pin-efficient, allowing you to handle 20 input pins with just 5 pins, for example.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AddSquaredMatrixKeyboard(pins []machine.Pin, keys [][]Keycode)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The following circuit is targeted. It is used in targets/sgh60 and targets/xiao-kb01, among others.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdosl86f4ah8xac2bl6yz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdosl86f4ah8xac2bl6yz.png" alt="circuit of squared-matrix" width="735" height="292"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  UartKeyboard
&lt;/h3&gt;

&lt;p&gt;This can handle key information sent via UART. It was primarily created for split keyboards.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AddUartKeyboard(size int, uart *machine.UART, keys [][]Keycode)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It is used in targets/sgkb, among others.&lt;/p&gt;
&lt;h2&gt;
  
  
  Configuring Vial Support
&lt;/h2&gt;

&lt;p&gt;Vial is a project for setting keymaps from web browsers and the like. To use it with sago35/tinygo-keyboard, you need to set &lt;code&gt;keyboard.KeyboardDef []byte&lt;/code&gt;. You can create a manual yourself, but basically, it's a good idea to prepare &lt;code&gt;vial.json&lt;/code&gt; and create &lt;code&gt;def.go&lt;/code&gt; with &lt;code&gt;gen-def&lt;/code&gt;. We'll discuss this later.&lt;/p&gt;

&lt;p&gt;When configured correctly, you can make settings from a web browser as shown in the screenshot below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw89xsizbinjd3vxmv47s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw89xsizbinjd3vxmv47s.png" alt="vial" width="551" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vial.rocks/" rel="noopener noreferrer"&gt;https://vial.rocks/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Creating vial.json
&lt;/h3&gt;

&lt;p&gt;For detailed instructions on how to create &lt;code&gt;vial.json&lt;/code&gt;, please refer to the following. However, since only a few items are used in sago35/tinygo-keyboard, it's a good idea to refer to existing vial.json files.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://get.vial.today/docs/porting-to-via.html" rel="noopener noreferrer"&gt;https://get.vial.today/docs/porting-to-via.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existing &lt;code&gt;vial.json&lt;/code&gt; files can be found under targets/.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/sago35/tinygo-keyboard/tree/main/targets" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo-keyboard/tree/main/targets&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/tinygo-keyboard/blob/main/targets/wiokey/vial.json" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo-keyboard/blob/main/targets/wiokey/vial.json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the &lt;code&gt;layouts.keymap&lt;/code&gt;, you can create it by copying JSON from KLE / Keyboard Layout Editor's &lt;code&gt;&amp;lt;/&amp;gt; Raw data&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.keyboard-layout-editor.com/" rel="noopener noreferrer"&gt;http://www.keyboard-layout-editor.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since only the top 3 buttons of the Wio Terminal are used this time, the vial.json looks like this. The minimum required settings for sago35/tinygo-keyboard are as follows. Note that name / vendorId / productId can be set to anything.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tinygo-wioterminal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vendorId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x2886"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"productId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x802D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"matrix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"rows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cols"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"layouts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"keymap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0,2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"0,1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"0,0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After saving the above as &lt;code&gt;vial.json&lt;/code&gt;, run &lt;code&gt;gen-def&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ls
go.mod  go.sum  main.go  vial.json

# Install gen-def
# It will be installed in the location displayed by `go env GOPATH`
$ go install github.com/sago35/tinygo-keyboard/cmd/gen-def@latest

# Generate def.go from vial.json
$ gen-def vial.json

$ ls
def.go  go.mod  go.sum  main.go  vial.json

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The automatically generated def.go looks like this. Vial support is completed by calling &lt;code&gt;loadKeyboardDef()&lt;/code&gt; defined here.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt; &lt;span class="s"&gt;"github.com/sago35/tinygo-keyboard"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;loadKeyboardDef&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;keyboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyboardDef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// ...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Please execute before calling &lt;code&gt;d.Loop()&lt;/code&gt; as follows.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;loadKeyboardDef&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The complete example source code is in main.go below.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sago35" rel="noopener noreferrer"&gt;
        sago35
      &lt;/a&gt; / &lt;a href="https://github.com/sago35/tinygo-keyboard-examples" rel="noopener noreferrer"&gt;
        tinygo-keyboard-examples
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      examples of sago35/tinygo-keyboard
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;tinygo-keyboard-examples&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;This repository is an example of a project using &lt;a href="https://github.com/sago35/tinygo-keyboard" rel="noopener noreferrer"&gt;sago35/tinygo-keyboard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can write to the Wio Terminal using the following command.&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ tinygo flash --target wioterminal --size short .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;how to start your keyboard project&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;You can use the "gonew" command to copy the project template.
Alternatively, you can also clone the GitHub project or download it as a zip file.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ gonew github.com/sago35/tinygo-keyboard-examples example.com/your/keyboard
gonew: initialized example.com/your/keyboard in .\keyboard

$ cd ./keyboard

$ tinygo flash --target wioterminal --size short .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Update def.go&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;gen-def&lt;/code&gt;.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;# install gen-def
$ go install github.com/sago35/tinygo-keyboard/cmd/gen-def@latest

# generage def.go from vial.json
$ gen-def vial.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sago35/tinygo-keyboard-examples" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Once you've successfully created the source code, try accessing Vial.&lt;br&gt;
Note: Please use Chrome or Edge browser&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft535wsgb1qrzs7to2ezi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft535wsgb1qrzs7to2ezi.png" alt="vial" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vial.rocks/" rel="noopener noreferrer"&gt;https://vial.rocks/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We've covered the information for creating a custom keyboard using TinyGo + Wio Terminal with sago35/tinygo-keyboard. If you have any questions or concerns, feel free to reach out by posting on the Issues section of the following repository or mention me on Twitter/X or mention me on Mastodon. We're here to help, so don't hesitate to ask.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/tinygo-keyboard" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo-keyboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/sago35tk" rel="noopener noreferrer"&gt;https://twitter.com/sago35tk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://social.tinygo.org/@sago35" rel="noopener noreferrer"&gt;https://social.tinygo.org/@sago35&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tutorial</category>
      <category>tinygo</category>
      <category>go</category>
      <category>keyboard</category>
    </item>
    <item>
      <title>TinyGo + Vim + gopls</title>
      <dc:creator>sago35</dc:creator>
      <pubDate>Sat, 09 May 2020 07:19:14 +0000</pubDate>
      <link>https://dev.to/sago35/tinygo-vim-gopls-48h1</link>
      <guid>https://dev.to/sago35/tinygo-vim-gopls-48h1</guid>
      <description>&lt;p&gt;You can now use tinygo.vim. For information on other editors, please check the URL below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tinygo.vim

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sago35/tinygo.vim" rel="noopener noreferrer"&gt;https://github.com/sago35/tinygo.vim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;IDE Integration | TinyGo

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tinygo.org/docs/guides/ide-integration/" rel="noopener noreferrer"&gt;https://tinygo.org/docs/guides/ide-integration/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;In the following GIF, gopls works well with the PyPortal (atsamd51j20a) configuration.&lt;br&gt;
You can confirm that you are jump correctly to board_pyportal.go etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0ygbdj7he426dslsu4n7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0ygbdj7he426dslsu4n7.gif" alt="Alt Text" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Gopls does not work well on tinygo for the following reasons.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TinyGo has its own built-in package

&lt;ul&gt;
&lt;li&gt;machine, device, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;buildtag&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this article, I will fix these problems by the following three items.&lt;br&gt;
In the end, you will be able to use LSP with TinyGo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add replace directives to go.mod&lt;/li&gt;
&lt;li&gt;Add go.mod to each package folder in tinygo&lt;/li&gt;
&lt;li&gt;Set environment variables (GOOS + GOARCH + GOFLAGS)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Windows 10&lt;/li&gt;
&lt;li&gt;Go version go1.14.1 windows/amd64&lt;/li&gt;
&lt;li&gt;tinygo version 0.13.1 windows/amd64 (using go version go1.14.1 and LLVM version 10.0.1)&lt;/li&gt;
&lt;li&gt;gopls ead0a569305d87def8dc4ad3899a7d78432b12c6&lt;/li&gt;
&lt;li&gt;Vim 8.2.147&lt;/li&gt;
&lt;li&gt;vim-go 13af5df6a1b3bc4bdfd03e3c05fa600d1dd16de6&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;note: Maybe it will work the same way on non-Windows and non-Vim.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Add replace directives to go.mod
&lt;/h2&gt;

&lt;p&gt;Add directives for things like machine packages that are special to tinygo.&lt;br&gt;
For example, it might look something like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module tinygo.org/x/drivers

go 1.14

replace (
    device/sam =&amp;gt; C:\tinygo\src\device/sam
    internal/reflectlite =&amp;gt; C:\tinygo\src\internal/reflectlite
    internal/task =&amp;gt; C:\tinygo\src\internal/task
    machine =&amp;gt; C:\tinygo\src\machine
    os =&amp;gt; C:\tinygo\src\os
    reflect =&amp;gt; C:\tinygo\src\reflect
    runtime =&amp;gt; C:\tinygo\src\runtime
    runtime/interrupt =&amp;gt; C:\tinygo\src\runtime/interrupt
    runtime/volatile =&amp;gt; C:\tinygo\src\runtime/volatile
    sync =&amp;gt; C:\tinygo\src\sync
    testing =&amp;gt; C:\tinygo\src\testing
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Add go.mod to each package folder in tinygo
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: if the right-hand side of a replace directive is a filesystem path, then the target must have a go.mod file at that location. If the go.mod file is not present, you can create one with go mod init.&lt;br&gt;
&lt;a href="https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive" rel="noopener noreferrer"&gt;https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;go.mod can be an empty file.&lt;br&gt;
So, for example, in bash, you can create a go.mod like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch C:/tinygo/src/device/sam/go.mod
touch C:/tinygo/src/internal/reflectlite/go.mod
touch C:/tinygo/src/internal/task/go.mod
touch C:/tinygo/src/machine/go.mod
touch C:/tinygo/src/os/go.mod
touch C:/tinygo/src/reflect/go.mod
touch C:/tinygo/src/runtime/go.mod
touch C:/tinygo/src/runtime/interrupt/go.mod
touch C:/tinygo/src/runtime/volatile/go.mod
touch C:/tinygo/src/sync/go.mod
touch C:/tinygo/src/testing/go.mod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Set environment variables (GOOS + GOARCH + GOFLAGS)
&lt;/h2&gt;

&lt;p&gt;When your target is a PyPortal, you can find out which environment variables to set with the following commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ tinygo info -target pyportal
LLVM triple:       armv7em-none-eabi
GOOS:              linux
GOARCH:            arm
build tags:        cortexm baremetal linux arm sam atsamd51 atsamd51j20 atsamd51j20a pyportal tinygo gc.conservative scheduler.tasks
garbage collector: conservative
scheduler:         tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following three things are required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set GOOS=linux
set GOARCH=arm
set GOFLAGS=-tags=cortexm,baremetal,linux,arm,sam,atsamd51,atsamd51j20,atsamd51j20a,pyportal,tinygo,gc.conservative,scheduler.tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In bash, I think you can configure it as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export GOOS=linux
export GOARCH=arm
export GOFLAGS=-tags=cortexm,baremetal,linux,arm,sam,atsamd51,atsamd51j20,atsamd51j20a,pyportal,tinygo,gc.conservative,scheduler.tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Add replace directives to go.mod&lt;/li&gt;
&lt;li&gt;Add go.mod to each package folder in tinygo&lt;/li&gt;
&lt;li&gt;Set environment variables (GOOS + GOARCH + GOFLAGS)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>go</category>
      <category>tinygo</category>
      <category>vim</category>
      <category>lsp</category>
    </item>
  </channel>
</rss>
