-
Notifications
You must be signed in to change notification settings - Fork 119
/
an-arduino-with-skidl-2017-04-01.html
156 lines (138 loc) · 17.1 KB
/
an-arduino-with-skidl-2017-04-01.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<!DOCTYPE html>
<html lang="en">
<head>
<title>SKiDL — An Arduino With SKiDL</title>
<meta charset="utf-8" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<link rel="stylesheet" type="text/css" href="/skidl/theme/css/style.css" />
<link rel='stylesheet' id='oswald-css' href='http://fonts.googleapis.com/css?family=Oswald&ver=3.3.2' type='text/css' media='all' />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Oswald&family=Roboto+Condensed&display=swap" rel="stylesheet">
<!-- <style type="text/css">
body.custom-background { background-color: #f5f5f5; }
</style> -->
<link rel="alternate" type="application/atom+xml"
title="SKiDL — Flux Atom"
href="/skidl/" />
<!--[if lte IE 8]><script src="/skidl/theme/js/html5shiv.js"></script><![endif]-->
</head>
<body class="home blog custom-background " >
<div id="container">
<div id="header">
<h1 id="site-title"><a href="/skidl"><img src="/skidl/images/banner.png" width="100%"></a></h1>
<!-- <h1 id="site-title"><a href="/skidl">SKiDL</a></h1> -->
</div><!-- /#banner -->
<div id="menu">
<div class="menu-navigation-container">
<ul id="menu-navigation" class="menu">
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="https://github.com/devbisme/skidl">Github</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="https://github.com/devbisme/skidl/discussions">Forum</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/skidl/category/posts.html">Blog</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/skidl/api/html/index.html">API</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/skidl/">Home</a></li>
</ul>
</div> <!--/#menu-navigation-container-->
</div><!-- /#menu -->
<div class="page-title">
</div>
<div id="contents">
<div class="post type-post status-publish format-standard hentry category-general" id="post">
<div class="entry-meta">
<span class="date"><a href="/skidl/an-arduino-with-skidl-2017-04-01.html">Sat 01 April 2017</a></span>
/
<span class="byline"><a href="/skidl/author/dave-vandenbout.html">Dave Vandenbout</a></span>
</div> <!-- /#entry-meta -->
<div class="main">
<h2 class="entry-title">
<a href="/skidl/an-arduino-with-skidl-2017-04-01.html" title="Permalink to An Arduino With SKiDL" rel="bookmark">An Arduino With SKiDL</a>
</h2>
<div class="entry-content">
<p>It's April 1st. It's also <a href="https://day.arduino.cc/">Arduino Day</a>. Really. That's not a joke.</p>
<p>In honor of such an august occasion, I'm going to show you how to describe
an Arduino board using SKiDL.
It's really easy; just takes two steps:</p>
<ol>
<li>Find an existing Arduino board designed using KiCad and export its netlist.</li>
<li>Use the <code>netlist_to_skidl</code> utility to convert it into a SKiDL file.</li>
</ol>
<p>For step #1, I'm going to use the <a href="https://github.com/rheingoldheavy/arduino_uno_r3_from_scratch">Arduino Uno R3 design</a>
done by <a href="http://www.rheingoldheavy.com/">Dan Hienzsch</a>.
There are two great features of Dan's design:</p>
<ul>
<li>All the parts are heavily annotated with their manufacturers, part numbers,
descriptions, usage notes, etc.</li>
<li>It's already done, which means I don't have to do it.</li>
</ul>
<p><img alt="A page of the Arduino schematic." src="images/an-arduino-with-skidl/arduino-schematic.png"></p>
<p>After loading the Arduino project with KiCad, the netlist for the design
is exported by the Eeschema schematic editor using the <code>Tools => Generate Netlist File...</code>
menu command.
The netlist file is called <code>Arduino_Uno_R3_From_Scratch.net</code>.</p>
<p>Step #2 - converting the Arduino netlist into a SKiDL script - is even easier:</p>
<div class="highlight"><pre><span></span><code>netlist_to_skidl<span class="w"> </span>-i<span class="w"> </span>Arduino_Uno_R3_From_Scratch.net<span class="sb">`</span>
</code></pre></div>
<p>That's it!
You can look inside <code>Arduino_Uno_R3_From_Scratch.py</code> and see the SKiDL code for the Arduino board.
It's divided into three sections:</p>
<ul>
<li>Definitions of <em>part templates</em>.</li>
<li>Instantiations of the templates to create the actual parts in the design.</li>
<li>Instantiations of <em>nets</em> to which the pins of the instantiated parts
are attached to form connections.</li>
</ul>
<p>For example, here is the definition of a template for a diode:</p>
<div class="highlight"><pre><span></span><code><span class="n">device_D</span> <span class="o">=</span> <span class="n">Part</span><span class="p">(</span><span class="s2">"Device"</span><span class="p">,</span> <span class="s1">'D'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="n">TEMPLATE</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">device_D</span><span class="p">,</span> <span class="s1">'Characteristics'</span><span class="p">,</span> <span class="s1">'DIODE GEN PURP 100V 300MA SOD123'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">device_D</span><span class="p">,</span> <span class="s1">'Description'</span><span class="p">,</span> <span class="s1">'ATMEGA328P ICSP Reset Voltage Spike Protection'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">device_D</span><span class="p">,</span> <span class="s1">'MFN'</span><span class="p">,</span> <span class="s1">'Diodes Inc'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">device_D</span><span class="p">,</span> <span class="s1">'MFP'</span><span class="p">,</span> <span class="s1">'1N4148W-7-F'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">device_D</span><span class="p">,</span> <span class="s1">'Package ID'</span><span class="p">,</span> <span class="s1">'SOD123'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">device_D</span><span class="p">,</span> <span class="s1">'Source'</span><span class="p">,</span> <span class="s1">'ANY'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">device_D</span><span class="p">,</span> <span class="s1">'Critical'</span><span class="p">,</span> <span class="s1">'N'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">device_D</span><span class="p">,</span> <span class="s1">'Subsystem'</span><span class="p">,</span> <span class="s1">'328P_Sub'</span><span class="p">)</span>
</code></pre></div>
<p>Further down in the script, this template is instantiated three times to create
three different parts, each with slightly different characteristics:</p>
<div class="highlight"><pre><span></span><code><span class="n">D1</span> <span class="o">=</span> <span class="n">device_D</span><span class="p">(</span><span class="n">ref</span><span class="o">=</span><span class="s1">'D1'</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="s1">'DIODE'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">D1</span><span class="p">,</span> <span class="s1">'Characteristics'</span><span class="p">,</span> <span class="s1">'1A, 1000V, SILICON, SIGNAL DIODE, ROHS COMPLIANT, COMPACT, PLASTIC, CASE 403D-02, SMA, 2 PIN'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">D1</span><span class="p">,</span> <span class="s1">'Description'</span><span class="p">,</span> <span class="s1">'Reverse Voltage Protection Diode'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">D1</span><span class="p">,</span> <span class="s1">'MFN'</span><span class="p">,</span> <span class="s1">'ON Semi'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">D1</span><span class="p">,</span> <span class="s1">'MFP'</span><span class="p">,</span> <span class="s1">'MRA4007T3G'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">D1</span><span class="p">,</span> <span class="s1">'Package ID'</span><span class="p">,</span> <span class="s1">'R-PDSO-J2'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">D1</span><span class="p">,</span> <span class="s1">'Subsystem'</span><span class="p">,</span> <span class="s1">'Voltage_Reg'</span><span class="p">)</span>
<span class="n">D4</span> <span class="o">=</span> <span class="n">device_D</span><span class="p">(</span><span class="n">ref</span><span class="o">=</span><span class="s1">'D4'</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="s1">'1N4148W-7-F'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">D4</span><span class="p">,</span> <span class="s1">'Description'</span><span class="p">,</span> <span class="s1">'ATMEGA16U2 ICSP Reset Voltage Spike Protection'</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">D4</span><span class="p">,</span> <span class="s1">'Subsystem'</span><span class="p">,</span> <span class="s1">'16U2_Sub'</span><span class="p">)</span>
<span class="n">D7</span> <span class="o">=</span> <span class="n">device_D</span><span class="p">(</span><span class="n">ref</span><span class="o">=</span><span class="s1">'D7'</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="s1">'1N4148W-7-F'</span><span class="p">)</span>
</code></pre></div>
<p>Finally, connections of these diodes to nets are defined:</p>
<div class="highlight"><pre><span></span><code><span class="n">net__32</span> <span class="o">=</span> <span class="n">Net</span><span class="p">(</span><span class="s1">'Vin'</span><span class="p">)</span>
<span class="n">net__32</span> <span class="o">+=</span> <span class="n">C1</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">P1</span><span class="p">[</span><span class="s1">'8'</span><span class="p">],</span> <span class="n">D1</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">R2</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">U1</span><span class="p">[</span><span class="s1">'3'</span><span class="p">]</span>
<span class="n">net__29</span> <span class="o">=</span> <span class="n">Net</span><span class="p">(</span><span class="s1">'5V_LDO'</span><span class="p">)</span>
<span class="n">net__29</span> <span class="o">+=</span> <span class="n">C4</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">U4</span><span class="p">[</span><span class="s1">'32'</span><span class="p">],</span> <span class="n">C9</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">U4</span><span class="p">[</span><span class="s1">'4'</span><span class="p">],</span> <span class="n">U5</span><span class="p">[</span><span class="s1">'20'</span><span class="p">],</span> <span class="n">U5</span><span class="p">[</span><span class="s1">'7'</span><span class="p">],</span> <span class="n">C5</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">U3</span><span class="p">[</span><span class="s1">'3'</span><span class="p">],</span> <span class="n">Q1</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">C15</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">R16</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">D7</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">U3</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">ICSP2</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">U2</span><span class="p">[</span><span class="s1">'8'</span><span class="p">],</span> <span class="n">ICSP1</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">R11</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">R10</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">R7</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">P1</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">P1</span><span class="p">[</span><span class="s1">'5'</span><span class="p">],</span> <span class="n">R1</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">C2</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">C3</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">D4</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">U1</span><span class="p">[</span><span class="s1">'2'</span><span class="p">]</span>
<span class="n">net__33</span> <span class="o">=</span> <span class="n">Net</span><span class="p">(</span><span class="s1">'Net-(CON1-Pad2)'</span><span class="p">)</span>
<span class="n">net__33</span> <span class="o">+=</span> <span class="n">CON1</span><span class="p">[</span><span class="s1">'3'</span><span class="p">],</span> <span class="n">CON1</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">D1</span><span class="p">[</span><span class="s1">'2'</span><span class="p">]</span>
<span class="n">net__54</span> <span class="o">=</span> <span class="n">Net</span><span class="p">(</span><span class="s1">'Net-(D4-Pad1)'</span><span class="p">)</span>
<span class="n">net__54</span> <span class="o">+=</span> <span class="n">D4</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">U4</span><span class="p">[</span><span class="s1">'24'</span><span class="p">],</span> <span class="n">ICSP1</span><span class="p">[</span><span class="s1">'5'</span><span class="p">],</span> <span class="n">R7</span><span class="p">[</span><span class="s1">'1'</span><span class="p">]</span>
<span class="n">net__5</span> <span class="o">=</span> <span class="n">Net</span><span class="p">(</span><span class="s1">'/ATMEGA328P/328P_RESET'</span><span class="p">)</span>
<span class="n">net__5</span> <span class="o">+=</span> <span class="n">D7</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">U5</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">SW1</span><span class="p">[</span><span class="s1">'4'</span><span class="p">],</span> <span class="n">P1</span><span class="p">[</span><span class="s1">'3'</span><span class="p">],</span> <span class="n">R16</span><span class="p">[</span><span class="s1">'1'</span><span class="p">],</span> <span class="n">R13</span><span class="p">[</span><span class="s1">'2'</span><span class="p">],</span> <span class="n">SW1</span><span class="p">[</span><span class="s1">'3'</span><span class="p">],</span> <span class="n">ICSP2</span><span class="p">[</span><span class="s1">'5'</span><span class="p">]</span>
</code></pre></div>
<p>You can see the entire Arduino SKiDL script <a href="https://gist.github.com/xesscorp/00d48e7ee31fedad00d6b07b9ddd0189">here</a>.</p>
<p>Once the SKiDL script is available, you can execute it to create the netlist
for an Arduino and then create the PCB using KiCad's <code>PCBNEW</code> layout editor.
Or use the SKiDL code as a module in a larger design.</p>
<p>So that's a complete Arduino in SKiDL.
Happy Arduino Day!</p>
<p>Really. I'm not joking.</p>
</div> <!--/#entry-content-->
</div> <!--/#main-->
</div> <!--/#post-->
</div>
<div id="footer">
<p> </p>
</div><!-- /#footer -->
</div><!-- /#container -->
<div style="display:none"></div>
</body>
</html>